代码之家  ›  专栏  ›  技术社区  ›  4est

许多列的生成类型

  •  0
  • 4est  · 技术社区  · 7 年前

    我有以下类型:

    TYPE t_my_list is record(col1 VARCHAR2(4000),col2 varchar2(4000),col3 varchar2(4000));
    Type  listOfString is table of t_my_list;
    

    然后我进行批量收集:

    EXECUTE IMMEDIATE v_stmt BULK COLLECT INTO v_ret;
    

    如果我有20列呢?我认为这样做是没有意义的:

    TYPE t_my_list is record(col1 VARCHAR2(4000),col2 varchar2(4000),....col20 varchar2(200);
    

    如何构建类型?

    更新 :

    declare
      TYPE                         t_my_list is record(colX VARCHAR2(4000),colY varchar2(4000),ColZ varchar2(4000));
      Type                         listOfString  is table of t_my_list;
      v_stmt      VARCHAR2(32000) := 'SELECT col1, col2, col2 FROM table_TEST';
      v_ret                        listOfString  := listOfString ();
    
    begin
       EXECUTE IMMEDIATE v_stmt BULK COLLECT INTO v_ret;
       --DBMS_OUTPUT.PUT_LINE('v_ret = '||v_ret.count);   
        for i in v_ret.first..v_ret.last loop
           DBMS_OUTPUT.PUT_LINE('colX: '||v_ret (i).colX||', colY: '||v_ret (i).colY||', ColZ: '||v_ret (i).ColZ);
           --will be done second EXECUTE IMMEDIATE taking as parameter ColX, ColY and ColZ
        end loop;
    end;
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Alex Poole    7 年前

    看起来您不需要使用动态SQL,因此可以静态声明一个游标,然后使用该游标的 %rowtype 要创建集合类型:

    declare
      cursor c_my_cursor is select col1, col2, col3 from table_test;
      type t_my_table is table of c_my_cursor%rowtype;
      v_ret t_my_table;
    begin
      open c_my_cursor;
      fetch c_my_cursor bulk collect into v_ret;
      close c_my_cursor;
    
      --DBMS_OUTPUT.PUT_LINE('v_ret = '||v_ret.count);   
      for i in v_ret.first..v_ret.last loop
        DBMS_OUTPUT.PUT_LINE('col1: '||v_ret (i).col1||', col2: '||v_ret (i).col2||', Col3: '||v_ret (i).Col3);
      end loop;
    end;
    /
    

    这不会循环光标,只会打开它,对集合执行单个批量提取,然后再次关闭它。

    如果出于某种原因选择了同一列两次,或者只想坚持X/Y/Z命名(或您想要的任何方案),则可以在光标查询中对列进行别名:

      cursor c_my_cursor is select col1 as colx, col2 as coly, col3 as colz from table_test;
    ...
        DBMS_OUTPUT.PUT_LINE('colX: '||v_ret (i).colX||', colY: '||v_ret (i).colY||', ColZ: '||v_ret (i).ColZ);