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

Oracle:カーソルを使用したIN句を使用した動的クエリ

    誰もが持っている古典的な状況。配列などに基づいて動的にクエリ文字列を作成できます。そして、OPENCURSORとして使用します。 。

      DECLARE
        v_mystring VARCHAR(50);
        v_my_ref_cursor sys_refcursor;
        in_string varchar2='''abc'',''bcd''';
        id2 varchar2(10):='123';
            myrecord tablename%rowtype;
      BEGIN
    
        v_mystring := 'SELECT a.*... from tablename a where name= :id2 and 
                        id in('||in_string||')';
    
        OPEN v_my_ref_cursor FOR v_mystring USING id2;
    
        LOOP
          FETCH v_my_ref_cursor INTO myrecord;
          EXIT WHEN v_my_ref_cursor%NOTFOUND;
            ..
          -- your processing
        END LOOP;
        CLOSE v_my_ref_cursor;
    
      END;
    

    IN句は最大1000項目をサポートします。代わりに、いつでもテーブルを使用して結合できます。そのテーブルは、Global Temporary Table(GTT)である可能性があります。 そのデータはその特定のセッションに表示されます。

    それでも、nested tableを使用できます それにも(PL / SQLテーブルのように)

    TABLE() PL / Sql表をSQLで理解できる表オブジェクト(実際にはオブジェクト)として変換します

    以下の簡単な例。

    CREATE TYPE pr AS OBJECT
               (pr  NUMBER);
    /
    CREATE TYPE prList AS TABLE OF pr;
    /
    
    declare
      myPrList prList := prList ();
      cursor lc is 
        select * 
          from (select a.*
                  from yourtable a
                       TABLE(CAST(myPrList as prList)) my_list
                 where 
                       a.pr = my_list.pr
                 order by a.pr desc) ;
      rec lc%ROWTYPE;
    
    BEGIN 
      /*Populate the Nested Table, with whatever collection you have */
      myPrList := prList ( pr(91),
                           pr(80));
      /*
         Sample code: for populating from your TABLE OF NUMBER type 
    
         FOR I IN 1..your_input_array.COUNT
         LOOP
              myPrList.EXTEND;
              myPrList(I) := pr(your_input_array(I));
         END LOOP;
      */
      open lc;
      loop 
        FETCH lc into rec;
        exit when lc%NOTFOUND; -- Your Exit WHEN condition should be checked afte FETCH iyself!
        dbms_output.put_line(rec.pr);
      end loop;
      close lc;
    END;
    /
    



    1. SQLDeveloperで自動インクリメント列を設定する方法

    2. 安全な接続を介したOracleのSQLServerへの接続

    3. MySQLデータベースに絵文字を保存する方法

    4. JavaMySQLとArrayListsの統合