获取Oracle类型数组并将内容插入到Oracle表中

获取Oracle类型数组并将内容插入到Oracle表中,oracle,plsql,collections,oracle11g,sql-insert,Oracle,Plsql,Collections,Oracle11g,Sql Insert,在我的包过程中,我有一个类型为wwv\u flow\u global.vc\u arr2的变量l\u 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

在我的包过程中,我有一个类型为
wwv\u flow\u global.vc\u arr2
的变量
l\u 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\u log
的表,该表包含以下列:

SEQ_ID  NUMBER,
C001    VARCHAR2(4000),
C002    VARCHAR2(4000),
C003    VARCHAR2(4000),
C004    VARCHAR2(4000),
C005    VARCHAR2(4000)
我的问题是,如何将类型为
wwv\u flow\u global.vc\u arr2
l\u rec
数组插入我的
message\u log
Oracle表

请注意,这里的SEQ_ID将是我的外循环计数器,因此我希望看到
消息日志
表数据,如下所示:

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

如果您使用
apex\u t\u varchar2
,您可以

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


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

您有一些选择。但是直接插入是不可能的

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;

嘿,斯科特-我不确定我是否理解你。实际上,我根本没有使用Oracle APEX,也没有使用
APEX\u t\u varchar2
。所有后端都使用Oracle 11g R2。如果你能回到我的例子中,那就太好了。你在第一句话中提到了一个未记录的APEX类型,因此假设你可以访问所提供的类型/包,或者你很乐意重新创建相同的定义。我经常在字符串/表操作中使用这些示例,用于您描述的类似概念。没有问题,Scott-将尝试使用它。
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;