Oracle存储过程中集合的默认值

问题描述 投票:0回答:1

我有三个表:test_main(开始时可能是空的),test_sec(几乎总是有记录)和绑定表test_ref(来自test_maintest_sec的storess唯一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个回答
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)。

© www.soinside.com 2019 - 2024. All rights reserved.