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

Oracle-複数の値で使用する場合のCLAUSEの質問で、動的にする

    残念ながら、コレクションタイプが(SQLではなく)PL / SQLで定義されている場合、SQLエンジンはそれを処理する方法を知らないため、SQLで使用することはできません。

    代わりに、SQLでコレクションの種類を定義した場合、つまり

    CREATE TYPE varchar_tbl
        IS TABLE OF varchar2(40);
    

    次に、次のようなことができます

    SELECT col1
      FROM table1 t1
     WHERE t1.id IN (SELECT column_value
                       FROM TABLE( <<variable of type varchar2_tbl>> ) )
    

    Oracleのバージョン(SQLでコレクションを使用するための構文は時間の経過とともに進化してきました)に応じて、古いバージョンのOracleの構文はより複雑になりました。

    PL / SQL連想配列(VARCHAR_ARRAY_TYPE)をPL / SQLのSQLネスト表コレクションに変換できますが、連想配列を繰り返し処理してネスト表を埋める必要があり、少し面倒です。 VARCHAR_TBL ネストされたテーブルコレクションはすでに作成されています

    SQL> CREATE OR REPLACE TYPE varchar_tbl
             IS TABLE OF varchar2(40);
    

    連想配列からネストされたテーブルに変換し、このようなSQLステートメントでネストされたテーブルを使用できます(SCOTT.EMPテーブルを使用)

    declare
      type varchar_array_type
        is table of varchar2(40)
           index by binary_integer;
      l_associative_array varchar_array_type;
      l_index             binary_integer;
      l_nested_table      varchar_tbl := new varchar_tbl();
      l_cnt               pls_integer;
    begin
      l_associative_array( 1 ) := 'FORD';
      l_associative_array( 10 ) := 'JONES';
      l_associative_array( 100 ) := 'NOT A NAME';
      l_associative_array( 75 ) := 'SCOTT';
      l_index := l_associative_array.FIRST;
      while( l_index IS NOT NULL )
      loop
        l_nested_table.EXTEND;
        l_nested_table( l_nested_table.LAST ) :=
                 l_associative_array( l_index );
        l_index := l_associative_array.NEXT( l_index );
      end loop;
      SELECT COUNT(*)
        INTO l_cnt
        FROM emp
       WHERE ename IN (SELECT column_value
                         FROM TABLE( l_nested_table ) );
      dbms_output.put_line( 'There are ' || l_cnt || ' employees with a matching name' );
    end;
    

    ただし、コレクションタイプ間の変換は少し面倒なので、連想配列が必要であるという特別な理由がない限り、通常はネストされたテーブルコレクションを使用する(そしてそれをストアドプロシージャに渡す)方がよいでしょう。




    1. Dbplyrを使用する場合の日付から年四半期形式への変換

    2. mysqlイベントが機能しない

    3. java.sql.SQLException:IO例外:ネットワークアダプタが接続を確立できませんでしたか?

    4. SelectForUpdateをEFCoreに実装する方法