通过执行立即更新获取错误ORA-00933

时间:2017-04-15 19:54:20

标签: oracle plsql

我必须编写一个编辑任务预定义特征的函数。我使用execute immediate但我收到此错误:

> Error report -
ORA-00933: SQL command not properly ended
ORA-06512: at "C##U1519.BEARBEITE", line 7
ORA-06512: at line 2
00933. 00000 - "SQL command not properly ended"

这是我的代码

create or replace procedure bearbeite(Aufg_ID Aufgabe.Aufgaben_ID%TYPE, Eigenschaft VARCHAR2, Wert VARCHAR2)
as
  sql_query_string2 VARCHAR2(4000);
begin 
  --überprüfen 
  sql_query_string2 := 'UPDATE Aufgabe SET ' || Eigenschaft || ' = ' || Wert || ' where Aufgabe.Aufgaben_ID = ' || Aufg_ID;
  EXECUTE IMMEDIATE sql_query_string2;

exception
  when no_data_found then
      dbms_output.put_line('Kein Wert');
end;


-- test
set serveroutput on
begin
  bearbeite(1,'Ort','TH WILDAU');
end;

为了使其有效,我该怎么办?提前致谢

2 个答案:

答案 0 :(得分:3)

将值转储到查询字符串中是危险的。最常见的危险是SQL注入,但在许多情况下(用户输入可能已经有控件),这并不适用。更大的问题是意外的语法错误。不止一个人 - 我敢肯定 - 在生成查询字符串时遇到了类似O'Neil的名称,这对他们造成了不利影响。

我强烈建议使用参数。在Oracle中这很容易:

sql_query_string2 := 'UPDATE Aufgabe SET ' || Eigenschaft || ' = :1 where Aufgabe.Aufgaben_ID = :2';
EXECUTE IMMEDIATE sql_query_string2 USING Wert, Aufg_ID;

这也意味着您不必担心是否使用单引号。

参数可以命名而不是编号。

遗憾的是,您不能使用SQL标识符的参数 - 表名,模式名,列名,函数,关键字。因此,列名称必须合并到字符串中。

答案 1 :(得分:1)

您应该使用单引号括起varchar2参数...在pl / sql中应该对其进行转义并变为''

sql_query_string2 := 'UPDATE Aufgabe SET ' || Eigenschaft || ' = ''' || Wert || ''' where Aufgabe.Aufgaben_ID = ' || Aufg_ID;