采用 Oracle 类型数组并将内容插入到 Oracle 表中



我的包过程中有一个wwv_flow_global.vc_arr2类型的变量l_rec,其中:

type vc_arr2 is table of varchar2(32767) index by binary_integer;

在l_rec内,我填充了许多记录。

在我的调试语句中,我可以使用以下查询访问记录:

FOR i IN 1..l_rec.COUNT
LOOP
insert into msg_log(msg) 
values
('Record info: Index: ' || i || ' - Value: ' || l_rec(i));
END LOOP;

仅供参考,我实际上还有一个外部循环,它重复以下信息但数据不同,即循环中的循环。

示例数据集如下所示:

Record info: Index: 1 - Value: AA
Record info: Index: 2 - Value: BB
Record info: Index: 3 - Value: CC
Record info: Index: 4 - Value: DD
Record info: Index: 5 - Value: EE
Record info: Index: 1 - Value: AAA
Record info: Index: 2 - Value: BBB
Record info: Index: 3 - Value: CCC
Record info: Index: 4 - Value: DDD
Record info: Index: 5 - Value: EEE
etc....

基于上述内容,我创建了一个名为message_log的表,其中包含以下列:

SEQ_ID  NUMBER,
C001    VARCHAR2(4000),
C002    VARCHAR2(4000),
C003    VARCHAR2(4000),
C004    VARCHAR2(4000),
C005    VARCHAR2(4000)

我的问题是,如何获取类型wwv_flow_global.vc_arr2l_rec数组并将全部内容插入我的message_logOracle 表中?

请注意,这里的SEQ_ID将是我的外循环的计数器,因此我希望看到message log表数据如下:

1,AA,BB,CC,DD,EE
2,AAA,BBB,CCC,DDD,EEE

如果你使用apex_t_varchar2,你可以

select * from table(apex_string.split('1,2,3',','));

declare
l_table apex_t_varchar2;
begin
apex_string.push(l_table, 'a');
apex_string.push(l_table, 'b');
sys.dbms_output.put_line(apex_string.join(l_table, ','));
end;
/

我认为这将满足您的一些需求。

你有几个选择。但直接插入是不可能的。

create table msg_log( 
seq_id number,
col1 varchar2(4000),
col2 varchar2(4000),
col3 varchar2(4000),
col4 varchar2(4000),
col5 varchar2(4000),
col6 varchar2(4000),
col7 varchar2(4000),
col8 varchar2(4000));

准备测试表。

在静态方法中,记录中的每个值都分配给行类型记录。
在动态方法中生成整个刀片。

declare 
type vc_arr2 is table of varchar2(32767) index by binary_integer;
rec vc_arr2;
row_msg_log msg_log%rowtype ;
function populate(how_many number) return vc_arr2  is
tmp vc_arr2; 
begin 
for i in 1 .. how_many loop
tmp(i) := 'VALUE'||i;
end loop;
return tmp;
end; 
function static_approach(id number , rec vc_arr2) return msg_log%rowtype 
is 
tmp msg_log%rowtype;
begin 
tmp.seq_id := id;
if rec.exists(1) then 
tmp.col1 := rec(1);
end if; 
if rec.exists(2) then 
tmp.col2 := rec(2);
end if; 
if rec.exists(3) then 
tmp.col3 := rec(3);
end if; 
--etc.
return tmp;
end; 
procedure dynamic_insert(id number , rec vc_arr2)  is 
v_sql varchar2(4000);
function generate_stament return varchar2 is
idx number; 
column_list varchar2(4000);
value_list  varchar2(4000);
begin 
column_list := '(seq_id';
value_list := '('||id;
idx := rec.first;
while (idx is not null)
loop
column_list := column_list||' ,col'||idx;
value_list := value_list||' ,'''||rec(idx)||'''';
idx := rec.next(idx);
end loop; 
column_list := column_list||') ';
value_list := value_list||') ';
return 'insert into msg_log'||column_list||'values'||value_list;
end;
begin 
v_sql := generate_stament;       
execute immediate  v_sql;      
end;
begin

row_msg_log := static_approach(1,populate(3));
insert into msg_log values row_msg_log;
row_msg_log := static_approach(2,populate(4));
insert into msg_log values row_msg_log;
dynamic_insert(3,populate(8));
dynamic_insert(4,populate(1));
-- with a not dens array
rec := populate(1);
rec(5) := 'blblb';
rec(8) := 'fofofo';
dynamic_insert(4,rec);
end;

最新更新