【问题标题】:Take Oracle Type Array and insert contents into an Oracle table获取 Oracle 类型数组并将内容插入 Oracle 表
【发布时间】:2019-12-26 10:02:38
【问题描述】:

我的包过程中有一个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_arr2 类型的 l_rec 数组并将全部内容插入到我的 message_log Oracle 表中?

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

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

【问题讨论】:

    标签: oracle plsql collections oracle11g sql-insert


    【解决方案1】:

    如果你使用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;
    /
    

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

    【讨论】:

    • 嘿,斯科特——我不确定我是否理解你的意思。我实际上根本没有使用 Oracle APEX,也没有使用apex_t_varchar2。所有后端使用 Oracle 11g R2。如果你能回想起我的例子,那就太好了。
    • 您在第一句话中引用了未记录的 APEX 类型,因此假设您可以访问提供的类型/包,或者您很乐意重新创建相同的定义。我经常将这些示例用于字符串/表格操作,用于您描述的类似概念。
    • 没问题,Scott - 会试试看。
    【解决方案2】:

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

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多