2016-04-06 5 views
0

Ich möchte Update-Prozedur machen, die die Spalte der Tabelle aktualisiert, hängt von Parameter ab.ORACLE: Wie man dynamischen Update-Vorgang abhängig von Parametern erstellen?

ist diese mögliche Aktualisierung das Feld abhängig von Eingangsparameter?

dies ist das Beispiel Verfahren, das ich gemacht habe:

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

und es nicht funktioniert. bitte helfen.

+0

Also 'Parameter' ist Spalte, die aktualisiert werden muss. Möchten Sie alle Spalten als 'newvalue' fest codieren? – Utsav

+0

nein @Utsav Ich wähle den neuen Wert aus einer anderen Tabelle und den von Ihnen geposteten Code, es funktioniert! danke trotzdem :) –

Antwort

0

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 
+0

Bessere Verwendung 'execute sofort' UPDATE tbl1 SET '|| column_name ||' =: val 'USING newvalue; ' –

+0

Dies ist ein Sicherheitsproblem (SQL-Injektion), wenn es in Produktionssystemen verwendet wird, z. 'call proc12 ('balance = 10000, col1')' aktualisiert den Kontostand für alle Zeilen auf 10000. –

+0

@FrankOckenfuss - Danke. Ich habe Logik hinzugefügt, um damit umzugehen. – Utsav