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

動的SQLステートメントをSYS_REFCURSORに実行する

    パラメータpAgeをバインドする必要があります およびpPostcode 。動的SQLでは、接頭辞としてコロン(:)を付けます。 )。 EXECUTE IMMEDIATEを使用する場合 またはOPEN ... FOR 、パラメータを位置を介してバインドします。これが、例でパラメータの名前を:P1と:P2に変更した理由です:

    DECLARE
       lsql VARCHAR2(500) := 'SELECT c.id 
                                FROM carer c, cared_for cf, carer_cared_for ccf 
                               WHERE c.id = ccf.carer_id (+)
                                 AND cf.id (+) = ccf.cared_for_id';
    BEGIN
       IF pPostcode IS NULL THEN
          lsql := lsql || ' AND :P1 IS NULL';
       ELSE
          lsql := lsql || ' AND c.postcode like ''%''|| upper(:P1)||''%''';
       IF pPostcode pAge > 0 THEN
          lsql := lsql || ' AND :P2 = ROUND((MONTHS_BETWEEN(sysdate,
                                                            c.date_of_birth)/12))';
       ELSE
          lsql := lsql || ' AND nvl(:P2, -1) <= 0';
       END IF;
       OPEN pReport FOR lsql USING pPostcode, pAge;
    END;
    

    注:バインド変数の数と位置は、コンパイル時に知る必要があります 、これが私が上記の構成をよく使用する理由です(使用されていない場合でもパラメーターをその位置に追加します)。トートロジーの追加(AND :P1 IS NULLのように )クエリを実行しても、説明プランには影響しません。



    1. SQLServerでのメンテナンスプランの作成

    2. Tomcatjdbc接続プール-放棄されたトランザクションのロールバック

    3. MySQL構文エラーメッセージオペランドには1つの列が含まれている必要があります

    4. 更新後のMysqlトリガーは、条件付きの別のテーブルに挿入されます