2016-04-06 11 views
0

私は、テーブルの列を更新する更新プロシージャを作成するには、パラメータによって異なります。ORACLE:パラメータに応じて動的更新プロシージャを作成する方法は?

入力パラメータに応じてフィールドを更新できますか?

これは私が作った手順例です:

CREATE OR REPLACE PROCEDURE procedure(parameter in varchar2) 
IS errormessage varchar2(255); 
    BEGIN 
    UPDATE table 
SET table.parameter = 'newvalue' 
END; 

をし、それがない作品を行います。 助けてください。

+0

したがって、パラメータは更新が必要な列です。すべての列を 'newvalue'としてハードコード化しますか? – Utsav

+0

いいえ@Utsav別のテーブルからその新しい値を選択し、投稿したコードは機能しています!とにかくありがとう:) –

答えて

0

編集:SQLインジェクションシナリオを処理します。

execute immediateと入力すると、parameterが列名として使用されます。

注:すべての行を更新するwhere節なしでupdate文を実行していることを覚えておいてください。

数値の列名は、newvalueという文字列で渡すこともできません。したがって、それを処理したい場合は、else文の条件を使用し、update文を実行する前に列のデータ型をチェックしてください。

CREATE OR REPLACE PROCEDURE proc12(column_name in varchar2) 
IS 
v_count integer; 
    BEGIN 
    select count(*) into v_count from (select column_name as txt from dual) where regexp_like (txt,'[,|=|;]'); 
    if v_count =0 then 
    execute immediate 'UPDATE tbl1 SET '||column_name||' = ''newvalue'''; 
    else 
    dbms_output.put_line('SQL Injection detected. Exiting'); 
end if; 
END; 




select * from tbl1; 

+------+ 
| col1 | 
+------+ 
| abc | 
| pqr | 
| xyz | 
+------+ 

call proc12('col1'); 

select * from tbl1; 

+----------+ 
| col1 | 
+----------+ 
| newvalue | 
| newvalue | 
| newvalue | 
+----------+ 

call proc12('balance=10000, col1'); 
SQL Injection detected. Exiting 
+0

'即時実行 'UPDATE tbl1 SET' || column_name || ' =:val 'USING newvalue;' –

+0

これは実稼働システムで使用されるセキュリティ上の問題(SQLインジェクション)です。 'call proc12( 'balance = 10000、col1')'はすべての行の残高を10000に更新します。 –

+0

@FrankOckenfuss - ありがとう。私はそれを処理するロジックを追加しました。 – Utsav

関連する問題