2015-04-29 110 views
-2
CREATE OR REPLACE PROCEDURE proc2_del_rows 
     (v_tname  VARCHAR2, 
     v_condition VARCHAR2 DEFAULT NULL) 
AS 
     sql_stmt  VARCHAR2(500); 
     where_clause VARCHAR2(200) := 'WHERE'||' '||v_condition; 
BEGIN 
     IF v_condition IS NULL THEN 
      where_clause := NULL; 
     END IF; 

     sql_stmt := 'DELETE FROM :1'||' '||where_clause; 

     EXECUTE IMMEDIATE sql_stmt USING v_tname; 
     COMMIT; 
END; 
/
+1

您的過程編譯正確。 – mmmmmpie

+0

@ mmmmmpie說,該過程編譯沒有任何錯誤。您是在問它的邏輯還是在編譯時遇到錯誤? – anudeepks

+0

如果我傳遞像proc2_del_rows('EMP','DEPTNO = 10')參數成功執行。但是當我傳遞參數像proc2_del_rows('EMP','JOB ='CLERK')它會給出錯誤。然後如何傳遞包含字符串數據的列。 –

回答

1
CREATE or replace PROCEDURE proc2_del_rows 
     (v_tname  VARCHAR2, 
     v_condition VARCHAR2 DEFAULT NULL) 
AS 
     sql_stmt  VARCHAR2(500); 
     where_clause VARCHAR2(200) := 'WHERE'||' '||v_condition; 
BEGIN 
     IF v_condition IS NULL THEN 
      where_clause := NULL; 
     END IF; 

     sql_stmt := 'DELETE FROM '||v_tname||' '||where_clause; 

     EXECUTE IMMEDIATE sql_stmt; 

END; 
/
+0

你能詳細說明你改變了什麼嗎? – mmmmmpie

2

表名是錯的不能綁定變量。對輸入表名稱參數執行DBMS_ASSERT並確保它是有效的表名稱文字,然後將其直接連接到delete語句。這至少可以保護你免受sql注入。

我想知道使用過程進行刪除並將此過程的執行授予個別用戶的原因,而不是直接向用戶授予對錶的刪除,這會更容易控制/限制。我不明白在安全方面如何更好,如果這是你的目標。

0

要在字符串文字中包含單引號字符,您需要將單引號加倍,如proc2_del_rows('EMP', 'JOB=''CLERK''')中所示。

Documentation here

分享和享受。