【问题标题】:Default Value for Collection in Oracle Stored ProcedureOracle 存储过程中集合的默认值
【发布时间】:2019-02-21 14:25:15
【问题描述】:

我有三个表:test_main(开始时可能为空)、test_sec(几乎总是有记录)和绑定表test_ref(存储来自test_maintest_sec 的记录的唯一ID 组合) .

我需要创建一个包,其中包含处理 test_maintest_ref 中记录的插入和更新的过程。我需要一些帮助。

这是一个包的代码:

create or replace package TEST_PKG is 
  type t_num is table of number;
  procedure ADD (arg_main_id number
                 , arg_name varchar2
                 , arg_sec_ids t_num);
end test_pkg;

create or replace package body test_pkg is 
  procedure ADD (arg_main_id number
                 , arg_name varchar2
                 , arg_sec_ids t_num)
  is begin
    insert into test_main (id, col_name) 
    values (arg_main_id, arg_name);
    commit;
    for i in arg_sec_ids.first .. arg_sec_ids.last loop
      insert into test_ref (main_id, sec_id) 
      values (arg_main_id, arg_sec_ids(i));
    end loop;
    commit;
  end ADD;
end test_pkg;

我计划在 Oracle APEX 5.1 PL/SQL 动态操作中调用此过程,如下所示:

declare
  selection apex_t_number 
  -- or "test_pkg.t_num" with values from "apex_string.split_numbers" added through a "for" loop later
begin
  selection := apex_string.split_numbers(:P1_SELECT2,':');
  -- for example, '1:2:3' string results in a [1,2,3] array
  ADD (arg_main_id => :P1_MAIN_ID
       , arg_name => :P1_MAIN_NAME
       , arg_sec_ids => selection);
end;

但我也希望能够将其称为ADD (arg_main_id => :P1_MAIN_ID, arg_name => :P1_MAIN_NAME),默认值为arg_sec_ids。 那么,是否可以在 PL/SQL 过程中为集合定义默认值,如果可以,如何定义?

【问题讨论】:

    标签: oracle plsql oracle11g oracle-apex-5.1


    【解决方案1】:

    您可以将arg_sec_ids 参数定义为in out 样式的类型为t_num

    create or replace package test_pkg is
        type t_num is table of number;
        procedure add (
                       arg_main_id number, 
                       arg_name    varchar2,
                       arg_sec_ids in out t_num 
                       );                   
    end;
    

    并假设在程序主体中使用arg_sec_ids := t_num(1,1,2,3,5,8); 进行初始化,并且如果使用元组中元素个数的整数进行扩展,则可以使用arg_sec_ids 的下一个值,例如arg_sec_ids(7),..,arg_sec_ids(10)

    create or replace package body test_pkg is
    procedure add (
                   arg_main_id number, 
                   arg_name    varchar2,
                   arg_sec_ids in out t_num 
                   ) is
    begin
    
      arg_sec_ids := t_num(1,1,2,3,5,8);
      arg_sec_ids.extend(10);
      insert into test_main (id, col_name)
      values (arg_main_id, arg_name);
    
      for i in arg_sec_ids.first .. arg_sec_ids.last loop
          insert into test_ref (main_id, sec_id)
          values (arg_main_id, arg_sec_ids(i));
      end loop;
          arg_sec_ids(7) := arg_sec_ids(5)+ arg_sec_ids(6);
          dbms_output.put_line( ' arg_sec_ids(7)''s values is : '||arg_sec_ids(7) );
      commit;
    end add;
    end;
    

    如果 arg_sec_ids.extend(x) 被省略(其中 x>6 ),则无法使用索引超过默认长度(在本例中为 6)的数组。

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 2010-09-14
      • 2015-11-12
      • 2012-08-06
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      相关资源
      最近更新 更多