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

PL/SQLストアドプロシージャでカスタムセットを返す方法

    コレクションの使用に特に慣れていない限り、参照カーソルを使用する方が簡単です:

    CREATE OR REPLACE PROCEDURE sample_procedure ( 
       p_some_select_sql_result OUT SYS_REFCURSOR 
    ) 
    AS 
    BEGIN
       OPEN p_some_select_sql_result FOR
          SELECT ...
          FROM ...
          JOIN ...
          ... etc.;
    END;
    /
    

    次に、JDBCから次のような操作を実行できます。

    cStmt = conn.prepareCall('{ call sample_procedure(?) }');
    cStmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
    cStmt.execute();
    rSet = cStmt.getCursor(1);
    

    その後、他の場合と同じように結果セットを反復処理できます。

    代わりに関数を使用することもできます:

    CREATE OR REPLACE FUNCTION sample_function RETURN SYS_REFCURSOR
    AS 
       l_some_select_sql_result
    BEGIN
       OPEN l_some_select_sql_result FOR
          SELECT ...
          FROM ...
          JOIN ...
          ... etc.;
    
       RETURN l_some_select_sql_result;
    END;
    /
    

    および

    cStmt = conn.prepareCall('{ ?=call sample_function }');
    cStmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
    cStmt.execute();
    rSet = cStmt.getCursor(1);
    

    明らかに、実際のプロシージャ/関数に渡す他のパラメータを処理する必要があります。



    1. table2.amountの合計(stat =1の場合)がテーブル1の費用の合計よりも大きいクエリ内のクエリ

    2. jsonまたはjsonbまたはテキストを選択するデータ型

    3. MySQL:別のクエリの結果と一致するテーブルのすべての行を更新します

    4. SQL構文エラー1064