从存储过程调用PL SQL Execute Immediate时,它不起作用



我已经创建了以下SP

create or replace PROCEDURE RM_SUPPORT_SCRIPTS_V2 
(
V_TABLENAME IN USER_TABLES.table_name%type
, V_SETCOLNAME IN NVARCHAR2 
, V_SETVALUE IN NVARCHAR2 
, V_WHERECOLNAME IN NVARCHAR2 
, V_WHEREKEYVALUE IN NVARCHAR2 
, USER_ID IN NVARCHAR2 
) 
IS 
BEGIN
EXECUTE IMMEDIATE 
'UPDATE '||DBMS_ASSERT.simple_sql_name(V_TABLENAME) 
||' SET :1 = :2, update_by_userid = :3, UPDATE_DATE = SYSDATE'
||' WHERE :4 = :5 '
using V_SETCOLNAME, V_SETVALUE, USER_ID, V_WHERECOLNAME, V_WHEREKEYVALUE; 

END RM_SUPPORT_SCRIPTS_V2;

但是当我从EXECUTE语句调用它时

EXEC RM_SUPPORT_SCRIPTS_V2 (USERS_TABLE, USER_ID,ORTEGALUX,USER_ID,TESTED,FX);    

我得到以下错误

错误报告-
ORA-06550:第1行,第31列:
PLS-00357:在此上下文中不允许使用表、视图或序列引用"USERS_Table">
ORA-06550:第1行、第7列:
PL/SQL:忽略的语句
06550。00000-";行%s,列%s:\n%s">
*原因:通常是PL/SQL编译错误
*操作:

有人知道为什么会发生这种情况吗?我曾尝试在每个表、列的调用中使用简单的逗号,但一直失败。

谢谢。

错误来自调用,而不是过程。你在传递字符串,所以你需要引用它们:

EXEC RM_SUPPORT_SCRIPTS_V2 ('USERS_TABLE', 'USER_ID','ORTEGALUX','USER_ID','TESTED','FX');

但是不能将绑定变量用于列名,需要将这些变量连接在中,就像使用表名一样。

EXECUTE IMMEDIATE 
'UPDATE '||DBMS_ASSERT.simple_sql_name(V_TABLENAME) 
||' SET ' || V_SETCOLNAME || ' = :1, update_by_userid = :2, UPDATE_DATE = SYSDATE'
||' WHERE ' || V_WHERECOLNAME || ' = :3 '
using V_SETVALUE, USER_ID, V_WHEREKEYVALUE; 

不过您可能也需要为这些添加断言检查。

最新更新