plsqlexecuteimmediate时,它不起作用

gt0wga4j  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(374)

我创建了以下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\u table”
ora-06550:第1行,第7列:
pl/sql:忽略语句
655000000-“行%s,列%s:\n%s”

  • 原因:通常是pl/sql编译错误。
  • 行动:

有人知道为什么会这样吗?我曾尝试在每个表、列的调用中使用简单的逗号,但仍然失败。
谢谢您。

nxowjjhe

nxowjjhe1#

错误来自调用,而不是过程。您正在传递字符串,因此需要引用它们:

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;

尽管您可能也希望为这些添加Assert检查。

相关问题