2015-04-29 88 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

分享和享受。