2

col_1、col_2、.. col_100のように呼ばれる100列のテーブルがあります。col_100は、その単一の列の値を100要素の配列に選択する方法はありますか?

(Oracle 10.2)

4

4 に答える 4

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)

等..

于 2013-03-05T15:09:21.417 に答える
1

これがブルートフォース方式です。おそらくもっとエレガントな方法、またはタイピングを減らす方法が少なくとも1つあります。この例では、100ではなく5つの列を使用しています。

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列では少し難しいでしょうが、クエリを邪魔にならないようにすると、必要な配列が得られます。

于 2013-03-05T14:51:02.343 に答える
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;
 /
于 2013-03-05T21:30:44.453 に答える
0

データのピボットを解除したいようです。

残念ながらUNPIVOT、11g(10.2ではなく)でのみ追加されましたが、手動でピボットを解除することはできましたが、他のソリューションの1つがうまく機能すると思います。

ただし、11g以降を使用している場合は、これを試すことができます

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

そこから単一の列配列に選択するのは簡単です

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;
 /
于 2016-10-27T13:44:03.763 に答える