sql >> データベース >  >> RDS >> Oracle

where句のOracleコレクション

    SQL句でローカルに宣言されたコレクションを使用することはできません:

    declare
        type i_name is table of nvarchar2(512);
        i_itemname i_name := i_name();
        c number;
    begin
        select distinct owner bulk collect into i_itemname from all_objects;
        dbms_output.put_line(i_itemname.count);
        select count(*) into c
        from all_tables
        where owner in (select * from table(i_itemname));
        dbms_output.put_line(c);
    end;
    /
    
        where owner in (select * from table(i_itemname));
                                            *
    ERROR at line 10:
    ORA-06550: line 10, column 41:
    PLS-00642: local collection types not allowed in SQL statements
    ORA-06550: line 10, column 35:
    PL/SQL: ORA-22905: cannot access rows from a non-nested table item
    ORA-06550: line 8, column 5:
    PL/SQL: SQL Statement ignored
    

    ただし、スキーマレベルで宣言されている場合は、基本的に、SQLがPL / SQLだけでなく、型を認識できるようにすることができます。

    create type i_name is table of nvarchar2(512);
    /
    
    Type created.
    
    declare
        i_itemname i_name := i_name();      
        c number;
    begin 
        select distinct owner bulk collect into i_itemname from all_objects;
        dbms_output.put_line(i_itemname.count);
        select count(*) into c from all_tables
        where owner in (select * from table(i_itemname));
        dbms_output.put_line(c);
    end;
    /
    
    No errors.
    18
    128
    
    PL/SQL procedure successfully completed.
    

    tableに参加することもできます サブクエリを使用するのではなく構築する:

    ...
        select count(*) into c
        from table(i_itemname) t
        join all_tables at on at.owner = t.column_value;
    ...
    

    でも、あなたが何をドンしているのかはよくわかりません。 (コレクションを他の目的で使用していない場合は、生データを結合する方がよいでしょうが、コレクションは理由があると思います)。

    @hakiがコメントで述べたように、次のこともできます:

    ...
        select count(*) into c
        from all_tables
        where owner member of (i_itemname);
    ...
    

    ... i_nameである限り と比較している列は同じですタイプ 。私の例では、nvarchar2を比較しようとしているため、行がゼロであることがわかります。 varchar2を使用 、ただし、i_nameを再定義すると一致するものが見つかります varchar2(512)として 。あなたの場合、おそらくtab.col nvarchar2です とにかく。




    1. SQL-同じ列から複数のテーブルを選択して複数の行を結合する方法は?

    2. (NVL、ABSなど)のようなネイティブOracle関数のリストを取得する方法

    3. PHPでMySQL列の合計を取得する

    4. Postgresでシーケンス名のリストを取得するにはどうすればよいですか?