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

EXECUTEIMMEDIATEを使用した動的SQL構文

    警告 :このような動的SQLは、SQLインジェクション攻撃の影響を受けやすくなっています。可能な限り、代わりにバインド変数を使用するように動的SQLを書き直してください。

    このように動的SQLを構築する代わりに:

    L_SQL := 'UPDATE '||l_prefix||'CRS_CUSTOMERS SET CUSTOMER_SOURCE_REF_ID = '||i.CUSTOMER_REF_ID||' WHERE CUSTOMER_ID = '||i.CUSTOMER_ID;
    EXECUTE IMMEDIATE L_SQL;
    

    これを使用してください:

    L_SQL := 'UPDATE '||l_prefix||'CRS_CUSTOMERS SET CUSTOMER_SOURCE_REF_ID = :REF_ID WHERE CUSTOMER_ID = :CUST_ID';
    EXECUTE IMMEDIATE L_SQL USING i.CUSTOMER_REF_ID, i.CUSTOMER_ID;
    

    これは、l_prefixでのSQLインジェクションの対象となります。 、ただし、その値をプログラムで制御すれば問題ない場合があります。また、SQLの構築とSQLの実行を2つのステップに分割すると、EXECUTE IMMEDIATEをより簡単に置き換えることができます。 DBMS_OUTPUT.PUT_LINE(SQL);を使用 クエリで構文エラーをチェックします。 DBMS_OUTPUT.PUT_LINEを実行することもできます。 パラメータi.CUSTOMER_REF_ID およびi.CUSTOMER_ID それらの値を確認します。




    1. 分離されたpgAdminおよびcmdpsqlデータベース

    2. IN パラメータを使用した手順

    3. カーソルからデータにアクセスする前に、カーソルが正しく初期化されていることを確認してください

    4. SQLクエリをCodeigniterActiveRecordに変換する