选择多行的单行作为数组的元素

时间:2013-03-05 14:13:32

标签: sql oracle

我有一个包含100列的表,名为col_1,col_2,.. col_100 有没有办法选择单列的值到100个元素的数组?

(Oracle 10.2)

4 个答案:

答案 0 :(得分:2)

您可以选择它们:

SQL> create type foo as table of number; -- or varray, as you wish.
  2  /

Type created.

SQL> select foo(l.a, l.b, l.c) foo from your_tab l;

FOO
-----------------
FOO(1, 2, 3)

等。

答案 1 :(得分:1)

这是一种蛮力方法。可能有一种更优雅的方式,或者至少有一种可以减少打字的方式。该示例使用五列而不是100列。

DECLARE
  -- Change VARCHAR2(10) in the next line to your col_1 .. col_100 type
  TYPE My100Array IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER;
  myVals My100Array;
  indx NUMBER;
BEGIN
   SELECT 'These', 'are', 'the', 'column', 'values'
     INTO myVals(1), myVals(2), myVals(3), myVals(4), myVals(5)
     FROM DUAL;
   FOR INDX IN 1..5 LOOP
    DBMS_OUTPUT.PUT_LINE(indx || ': ' || myVals(indx));
   END LOOP;
END;

这是我运行时的输出:

1: These
2: are
3: the
4: column
5: values

当然,对于100列来说,这会有点困难,但是一旦你得到了查询,就可以得到你想要的数组。

答案 2 :(得分:0)

另一个例子:

DECLARE 
   CURSOR c_data IS
   SELECT * FROM scott.emp; -- replace emp table with your_table

   TYPE t_source_tab IS TABLE OF scott.emp%ROWTYPE;
   l_tab    t_source_tab;
 BEGIN
   SELECT * BULK COLLECT INTO l_tab FROM scott.emp;

   -- display values in array --
   FOR i IN l_tab.FIRST ..l_tab.LAST 
   LOOP
      DBMS_OUTPUT.PUT_LINE (l_tab(i).hiredate ||chr(9)||l_tab(i).empno  ||chr(9)||l_tab(i).ename);
   END LOOP;   
 END;
 /

答案 3 :(得分:0)

听起来你想要取消数据..

不幸的是create table my_table (col1 number,col2 number, col3 number); Table MY_TABLE created. insert into my_table values (4,5,6); 1 row inserted. select * from my_table; COL1 COL2 COL3 ---------- ---------- ---------- 4 5 6 select val from my_table unpivot ( val for col in ( col1,col2,col3)); VAL ---------- 4 5 6 仅在11g(不是10.2)中添加 你可以手动取消,但我认为其中一个解决方案会更好用。

但是,如果您使用11g或更高版本,则可以尝试使用

DECLARE 
   CURSOR c_data IS
   select val from my_table unpivot ( val for col in ( col1,col2,col3));


   TYPE t_source_tab IS TABLE OF c_data%ROWTYPE;
   l_tab    t_source_tab;
 BEGIN

    open c_data;
    fetch c_data bulk collect into l_tab;
    close c_data;

   -- display values in array --
   FOR i IN l_tab.FIRST ..l_tab.LAST 
   LOOP
      DBMS_OUTPUT.PUT_LINE (l_tab(i).val);
   END LOOP;   
 END;
 /

从中可以轻松选择单列数组

File tempFile = File.createTempFile(<a base name of file as String>, "tmp", <folder as File>);