Bearbeiten: Behandelt SQL Injection-Szenario.
Sie benötigen execute immediate
, da parameter
als Spaltenname verwendet wird.
Hinweis: Denken Sie daran, dass Sie update-Anweisung ohne where-Klausel ausführen, die alle Zeilen aktualisiert.
Sie können auch keinen numerischen Spaltennamen übergeben, da der Wert newvalue
eine Zeichenfolge ist. Wenn Sie damit umgehen möchten, verwenden Sie andernfalls if else condition und prüfen Sie vor dem Ausführen der update-Anweisung auf den Spaltendatentyp.
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
Also 'Parameter' ist Spalte, die aktualisiert werden muss. Möchten Sie alle Spalten als 'newvalue' fest codieren? – Utsav
nein @Utsav Ich wähle den neuen Wert aus einer anderen Tabelle und den von Ihnen geposteten Code, es funktioniert! danke trotzdem :) –