2016-07-12 6 views
1

テーブルタイプのインデックスを指定せずにSELECTステートメントのIN句にローカルテーブルタイプを使用する方法はありますか?実行さ指定されたインデックスのないSELECTステートメントでのローカルテーブルタイプの使用

DECLARE 
    TYPE temp_rec_TYPE IS RECORD (
     n_temp_id NUMBER 
    ); 

    TYPE temp_tab_TYPE IS TABLE OF temp_rec_TYPE INDEX BY PLS_INTEGER; 
    temp_tab temp_tab_TYPE; 

    n_temp_id2 NUMBER; 
BEGIN 
    temp_tab(1).n_temp_id := 1; 

    FOR temp_rec IN (SELECT * FROM example_table WHERE id IN temp_tab) 
    LOOP 
     NULL; 
    END LOOP; 
END; 

復帰「PLS-00382:式が間違った型である」

+1

これは、私が思うに、前に頼まれた:http://stackoverflow.com/questions/5165580/how-to-use-a-table-type-in​​-a-select-from -ステートメント – vercelli

答えて

0

いいえ、SQL式はSQLスコープ(ないPL/SQLの範囲で生成された参照のみのタイプが可能 - パッケージにはない、すなわち、 PL/SQLブロックもありません)。あなたがいる限り、PL/SQLタイプはパッケージ仕様で定義されているように、Oracleの12cにそれを行うことができます

CREATE TYPE number_list IS TABLE OF NUMBER; 
/

DECLARE 
    temp_tab number_list; 
BEGIN 
    temp_tab := number_list(1); 

    FOR temp_rec IN (SELECT * FROM example_table WHERE id MEMBER OF temp_tab) 
    LOOP 
    NULL; 
    END LOOP; 
END; 
/
0

:あなたが欲しい

のようなものです。次に例を示します。

CREATE OR REPLACE PACKAGE matt_p1 AS 
    TYPE temp_rec_type IS RECORD (n_temp_id NUMBER); 
    TYPE temp_tab_type IS TABLE OF temp_rec_type 
    INDEX BY PLS_INTEGER; 

END matt_p1; 
/

DECLARE 

    temp_tab  matt_p1.temp_tab_type; 

    n_temp_id2 NUMBER; 
BEGIN 
    SELECT object_id 
    BULK COLLECT INTO temp_tab 
    FROM dba_objects 
    WHERE OBJECT_NAME LIKE 'DBA_TAB%'; 

    FOR temp_rec IN (SELECT object_name 
        FROM dba_objects 
        WHERE object_id IN (SELECT n_temp_id FROM TABLE(temp_tab))) LOOP 
    dbms_output.put_line(temp_rec.object_name); 
    END LOOP; 
END; 
関連する問題