我有三个表:test_main
(开始时可能是空的),test_sec
(几乎总是有记录)和绑定表test_ref
(来自test_main
和test_sec
的storess唯一id组合记录)。
我需要创建一个包含处理test_main
和test_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过程中为集合定义默认值,如果是,如何?
您可以定义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
)。