2017-05-29 9 views
0

テーブルOS_CW.CW_FELDDATEN属性のPRIMITIVUMNUMMER(NOT NULL NUMBER(38))とローカル配列の値v_list_pNummberを比較したいと思います。これは私がこれまで持っているものです。SELECT INTOステートメントのテーブルの使い方

DECLARE 
    TYPE array_of_numbers IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; 
    v_list_parentID  array_of_numbers; 
    v_list_pNummer  array_of_numbers; 
BEGIN 
    SELECT DBUID BULK COLLECT INTO v_list_parentID 
    FROM OS_SYS.V_CATALOG 
    WHERE PARENTID = 1; 

    SELECT PRIMITIVUMNUMMER BULK COLLECT INTO v_list_pNummer 
    FROM OS_CW.CW_FELDDATEN 
    WHERE KATALOG IN (v_list_parentID); 
END; 

私はこのエラーを取得する上記のコードを実行している場合:

Error report -
ORA-06550: line 28, column 104:
PLS-00382: expression is of wrong type
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:

どのように私はBINARY_INTEGER BYテーブル番号INDEXでカラム(番号)を比較することができますか?

ありがとうございます!

答えて

0

MEMBER OF句を使用して、inlistをSQL文で作成する必要があります。また、匿名ブロック内に型を作成し、それを実行したような節のSQL文で使用することはできません。あなたはPLSQLブロックの外側で型を宣言し、それを使用する必要があります。

CREATE OR REPLACE TYPE array_of_numbers IS TABLE OF NUMBER ; 
/
DECLARE 

    v_list_parentID array_of_numbers; 
    v_list_pNummer array_of_numbers; 
BEGIN 
    SELECT DBUID 
    BULK COLLECT INTO v_list_parentID 
    FROM OS_SYS.V_CATALOG 
    WHERE PARENTID = 1; 

    SELECT PRIMITIVUMNUMMER 
    BULK COLLECT INTO v_list_pNummer 
    FROM OS_CW.CW_FELDDATEN 
    WHERE KATALOG MEMBER OF v_list_parentID; 
END; 

は、ここで詳細を参照してください。 http://www.oracle-developer.net/display.php?id=301

2

SQLは、ローカルのPL/SQLスコープで宣言された型を使用することはできません。あなたは、SQL (*)でそれを定義する必要があります。

SQL> set serveroutput on 
SQL> declare 
    2  v_list_parentID array_of_numbers; 
    3  v_list_pNummer array_of_numbers; 
    4 begin 
    5  select dbuid bulk collect into v_list_parentID 
    6   from v_catalog 
    7   where parentid = 1; 
    8  dbms_output.put_line('v_list_parentID count = ' || v_list_parentID.count()); 
    9 
10  select primitivumnummer bulk collect into v_list_pNummer 
11   from cw_felddaten 
12   where katalog in (select * from table(v_list_parentID)); 
13 
14  dbms_output.put_line('v_list_pNummer count = ' || v_list_pNummer.count()); 
15 end; 
16/
v_list_parentID count = 4 
v_list_pNummer count = 24 

PL/SQL procedure successfully completed. 

SQL> 

SQL> create TYPE array_of_numbers IS TABLE OF NUMBER ; 
    2/

Type created. 

SQL> 

が次にあなたがIN演算子を参照することができ、サブクエリに最初のコレクションを変換するために、TABLE()演算子を使用します

MEMBER OF構文も機能します。これは入力が少なくて済みますが、CW_FELDDATENに大量の行がある場合はTABLE()演算子と同様に実行されません。私たちは、SQLパッケージ仕様で宣言された型を使用することができ12Cに

SQL> declare 
    2  v_list_parentID array_of_numbers; 
    3  v_list_pNummer array_of_numbers; 
    4 begin 
    5  select dbuid bulk collect into v_list_parentID 
    6   from v_catalog 
    7   where parent_id = 1; 
    8  dbms_output.put_line('v_list_parentID count = ' || v_list_parentID.count()); 
    9 
10  select primitivumnummer bulk collect into v_list_pnummer 
11   from cw_felddaten 
12   where katalog member of v_list_parentID; 
13 
14  dbms_output.put_line('v_list_pNummer count = ' || v_list_pNummer.count()); 
15 end; 
16/
v_list_parentID count = 4 
v_list_pNummer count = 24 

PL/SQL procedure successfully completed. 

SQL> 

(*)

関連する問題