【问题标题】:PL SQL Execute Immediate not working when calling it from a stored procedure从存储过程调用时,PL SQL Execute Immediate 不起作用
【发布时间】:2020-07-15 20:12:48
【问题描述】:

我已经创建了以下 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 编译错误。
*行动:

有谁知道为什么会发生这种情况?我尝试在每个表、列的调用中加入简单的逗号,但仍然失败。

谢谢。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

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

    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; 
    

    尽管您可能也想为这些添加断言检查。

    【讨论】:

    • 谢谢@Alex Poole 我已尝试按照您的通知引用,但我现在收到此错误code 错误从第 1 行开始:命令中的 BEGIN RM_SUPPORT_SCRIPTS_V2 ('user_list', 'USERS_TABLE' ,'ORTEGALUX','USER_ID','TESTED','FX');结尾;错误报告 - ORA-06550:第 1 行,第 316 列:PLS-00201:必须声明标识符 'RM_SUPPORT_SCRIPTS_V2' ORA-06550:第 1 行,第 316 列:PL/SQL:语句被忽略 06550。00000 -“第 %s 行,列%s:\n%s" *原因:通常是 PL/SQL 编译错误。 *行动:
    • 您将 RM 更改为 FMV?那似乎不存在...?
    • 嗯,它真的存在吗?在您调用它的同一架构中? (错误真的是指第 316 列吗?这看起来很奇怪。}
    • 你是对的,我的架构有误,现在我得到了这个 ORA-01747: invalid user.table.column, table.column, or column specification ORA-06512: at "OPTIMA.RM_SUPPORT_SCRIPTS_V2" ,第 12 行 ORA-06512:在第 1 行 01747.00000 -“无效的 user.table.column、table.column 或列规范”
    • 更新,我有不同表的脚本,错误仍然存​​在。
    猜你喜欢
    • 2021-04-15
    • 2014-07-11
    • 2020-04-25
    • 2014-05-11
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多