【问题标题】:How to store a column of result of select query in an array?如何将选择查询的一列结果存储在数组中?
【发布时间】:2016-10-17 22:00:41
【问题描述】:

如果我们在一个编号类型的表中有一个列,我们如何将对该列的选择查询结果存储在一个数组中?

【问题讨论】:

标签: oracle plsql


【解决方案1】:

创建一个存储编号的类型:-

CREATE OR REPLACE TYPE varray is table of number;

--在 for loop () 中编写您的选择查询,我将在其中通过级别进行提取

 declare
      p  varray := varray();
    BEGIN
      for i in (select level from dual connect by level <= 10) loop
        p.extend;
        p(p.count) := i.level;
      end loop;
      for xarr in (select column_value from table(cast(p as varray))) loop
         dbms_output.put_line(xarr.column_value);
     end loop;
  END;

输出:-

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

【讨论】:

    【解决方案2】:

    此示例使用列表(数字表)来实现这一点,因为我发现 这些列表更方便:

    CREATE OR REPLACE TYPE numberlist AS TABLE OF NUMBER;
    
    DECLARE 
       v_numberlist numberlist;
    BEGIN
       SELECT intval numbercolumn
         BULK COLLECT INTO v_numberlist
         FROM lookup;
       FOR i IN 1..v_numberlist.count
       LOOP
          dbms_output.put_line( v_numberlist(i) );
       END LOOP;     
    END;
    

    【讨论】:

      【解决方案3】:

      您可能还想将整个选择放在一个表格中。您可以将BULK COLLECT 用于数组:

      CREATE OR REPLACE TYPE t_my_list AS TABLE OF VARCHAR2(100);    
      
      CREATE OR REPLACE 
      PROCEDURE get_tables(p_owner in varchar2)
      as
        v_res   t_my_list;
        v_qry   varchar2(4000) := '';
      begin
      
          v_qry :=  ' SELECT table_name from all_tables where owner='''||p_owner||'''';            
          dbms_output.put_line(v_qry);    
          -- all at once in the table
          execute immediate v_qry bulk collect into v_res;
          FOR I in 1..v_res.count 
          loop
              dbms_output.put_line(v_res(i));
          end loop;
      
      exception
      when others then
          raise;
      end get_tables;
      /
      
      begin
          get_tables('E') ;
      end;
      /
      

      【讨论】:

        【解决方案4】:

        只是使用某些本机 SQL 数据类型的选项。希望对您有所帮助。

        SET SERVEROUTPUT ON;
        DECLARE
          lv_num_tab DBMS_SQL.NUMBER_TABLE;
        BEGIN
          SELECT LEVEL BULK COLLECT INTO lv_num_tab FROM DUAL CONNECT BY LEVEL < 10;
          FOR I IN lv_num_tab.FIRST..lv_num_tab.LAST
          LOOP
            dbms_output.put_line(lv_num_tab(i));
          END LOOP;
        END;
        

        【讨论】:

          猜你喜欢
          • 2021-12-28
          • 2021-09-24
          • 2015-08-31
          • 1970-01-01
          • 1970-01-01
          • 2020-03-09
          • 2012-07-15
          • 2013-09-24
          • 2012-11-05
          相关资源
          最近更新 更多