SQL过程中的更新语句错误

时间:2014-09-25 06:31:04

标签: oracle plsql

我正在编写一个存储过程来更新表中的数据,我将使用新数据(col1='new values', col2='new 2 values')传递一个字符串。但是当我编译我的存储过程时,我收到一个错误: - “缺少等号”。

即使我尝试以不同的方式(在proc中注释代码),但这也是错误。

CREATE OR REPLACE PROCEDURE "MY_UPDATE_PROC"(update_values IN VCHAR2,myid IN INT)

sqlStmt VARCHAR2(1024);

BEGIN

UPDATE MY_TEST_TABLE SET update_values WHERE (TEST_Id = myid);

--sqlStmt := 'UPDATE MY_TEST_TABLE SET ' ||  update_values || ' WHERE TEST_Id = ' ||myid ;

-- EXECUTE sqlStmt;

END;

2 个答案:

答案 0 :(得分:0)

试试这个(未经测试):

CREATE OR REPLACE PROCEDURE "MY_UPDATE_PROC"(update_values IN VARCHAR2, myid IN NUMBER) AS
  sqlStmt VARCHAR2(1024);
BEGIN
  sqlStmt := 'UPDATE MY_TEST_TABLE SET ' ||  update_values || ' WHERE TEST_Id = ' || myid;
  EXECUTE IMMEDIATE sqlStmt;
END;
/

您的第一个参数的数据类型应为VARCHAR2(可能只是帖子中的拼写错误)

答案 1 :(得分:0)

Oracle中简单更新语句的语法是:

Update <table_name>
   set <column_name> = some_value
 where <conditions..>

您需要提供的更新语句缺少= some_value部分。

CREATE OR REPLACE PROCEDURE "MY_UPDATE_PROC"(P_update_values IN CHARVAR2, p_myid IN INT)

BEGIN

  UPDATE MY_TEST_TABLE 
     SET col1 = p_update_values 
   WHERE TEST_Id = p_myid;

END;
/

使用动态SQL,虽然在这种情况下不需要:

CREATE OR REPLACE PROCEDURE "MY_UPDATE_PROC"(p_update_values IN VARCHAR2, p_myid IN NUMBER) AS
  sqlStmt VARCHAR2(1024);
BEGIN
  sqlStmt := 'UPDATE MY_TEST_TABLE SET col1 = :a WHERE TEST_Id = :b';
  EXECUTE IMMEDIATE sqlStmt USING p_update_values, p_myid;
END;
/

需要注意的事项:

1)始终使用有效且不同的名称,这些名称不是参数的列名。

2)在上面的示例中,始终使用绑定变量:a和:b,以避免SQL注入并提高整体性能,如果您要多次调用此过程。