我必须编写一个编辑任务预定特征的函数。我正在使用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;
为了使它起作用,该怎么办?预先感谢
将值倾倒到查询字符串很危险。广告宣传的危险是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标识符 - 表名称,架构名称,列名称,函数,密钥单词。因此,列名确实必须合并到字符串中。
您应该用单引号包围varchar2
参数...在PL/SQL中应逃脱并变成'''
sql_query_string2 := 'UPDATE Aufgabe SET ' || Eigenschaft || ' = ''' || Wert || ''' where Aufgabe.Aufgaben_ID = ' || Aufg_ID;