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

Oracleでsys_refcursorを使用して動的SQLを作成する方法

    なぜwithに悩まされているのかわかりません 条項、それはCTEなしでより簡単です。 cityのテーブルを特定するだけです。 列は次のとおりです:

    function myfunc(p_city IN VARCHAR2,
      p_order IN VARCHAR2)
    RETURN SYS_REFCURSOR IS
      v_result          SYS_REFCURSOR;
    begin
      OPEN v_result FOR
        'select * from tableA ta
         inner join tableB tb on tb.some_col = ta.some_col
         where :p_city is null or LOWER(ta.city) like ''%''||:p_city||''%''
         order by ' || p_order || ' asc'
         using p_city, p_city;
    
      return v_result;
    end myfunc;
    /
    

    テーブルAだと思いますが、他のエイリアスの場合はエイリアスを変更してください。また、2つのテーブル間の結合条件を指定する必要があります。 (ascの前にスペースを追加したことにも気づきました それがorder-by文字列に連結されるのを防ぐためです。

    これはエラーなしでコンパイルされます。実行すると、ORA-00942が表示されます。テーブルまたはビューが存在しません。これは妥当です。ダミーデータを作成する場合:

    create table tablea (some_col number, city varchar2(30));
    create table tableb (some_col number);
    
    insert into tablea values (1, 'London');
    insert into tablea values (2, 'Londonderry');
    insert into tablea values (3, 'East London');
    insert into tablea values (4, 'New York');
    
    insert into tableb values (1);
    insert into tableb values (2);
    insert into tableb values (3);
    insert into tableb values (4);
    

    それを呼び出すと次のようになります:

    select myfunc('lond', 'city') from dual;
    
      SOME_COL CITY                             SOME_COL
    ---------- ------------------------------ ----------
             3 East London                             3
             1 London                                  1
             2 Londonderry                             2
    

    何らかの理由で本当にCTEを使い続けたい場合は、(@ boneistが言ったように)動的ステートメントの一部である必要があります:

      OPEN v_result FOR
        'with all_prb as (
           select * from tableA ta
           inner join tableB tb on tb.some_col = ta.some_col
         )
         select * from all_prb ff
         where :p_city is null or LOWER(ff.city) like ''%''||:p_city||''%''
         order by ' || p_order || ' asc'
         using p_city, p_city;
    



    1. 効率的なコーディングでWinformTreeView(C#)にデータを挿入するにはどうすればよいですか?

    2. MySQL PHPのクエリに配列を渡すことにより、OR条件を動的に作成します

    3. SQL Server Compact EditionでASP.NETメンバーシップを使用できますか?

    4. MySQLでの全文検索のためのAgainstでのサブクエリの使用