【问题标题】:Identifier must be declared after EXECUTE IMMEDIATE标识符必须在 EXECUTE IMMEDIATE 之后声明
【发布时间】:2011-10-26 20:43:01
【问题描述】:

在 StackOverflow 的帮助下,我解决了一个问题,但现在我遇到了另一个问题。在我的程序中,我有以下代码:

 BEGIN 
FOR nr IN 1..102 
LOOP
    DBMS_OUTPUT.PUT_LINE(nr);
    EXECUTE IMMEDIATE 
        'BEGIN ' || 
            'IF rec.column_' || nr ||' IS NULL THEN ' || 
                ':x:=1; ' || 
            'ELSE ' ||
                ':x:=0; ' ||
            'END IF; ' ||
        'END; ' 
        USING OUT isnull;
    IF isnull = 1 THEN 
        DBMS_OUTPUT.PUT_LINE('test');
    END IF;
END LOOP;

结束;

不幸的是,当我尝试运行此程序时,我收到错误消息:必须声明 PLS-00201 标识符“rec.column_1”。我发现:

在您正在执行的动态 SQL 中,您引用 OrderStoreData,但在动态 SQL 中没有定义该名称的变量。 由 Execute Immediate 执行的代码在它自己的范围内执行,所有未明确定义为 NDS 的一部分或作为绑定变量传入的所有内容都将超出范围。

但我不知道如何处理。

【问题讨论】:

    标签: sql database plsql


    【解决方案1】:

    必须从动态 sql 块访问记录,因此例如将其放在包头中。然后它在全球范围内可用......

    【讨论】:

    • 好的,但是 rec 来自我的光标。在我使用 for 循环的过程中:for rec in cu_um 当我输入 TYPE cu_um IS REF CURSOR 时,我仍然收到此错误。
    • 您必须在该包中定义变量,使其与循环中的 rec 类型相同,并在循环之前将 rec 分配给该包变量。
    猜你喜欢
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2014-06-24
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多