我正在编写一个存储过程来更新表中的数据,我将使用新数据(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;
答案 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注入并提高整体性能,如果您要多次调用此过程。