【问题标题】:Function - oracle (PLS-00103: Encountered the symbol "")函数 - oracle(PLS-00103:遇到符号“”)
【发布时间】:2019-06-28 14:18:38
【问题描述】:

我正在尝试创建一个简单的 oracle 函数,该函数循环遍历一些记录,然后为每个记录插入记录..

CREATE OR REPLACE FUNCTION addNewRolesToAllGDP
    return NUMBER
    is dummy number;
BEGIN
    FOR applicationId IN (SELECT APPID
                          FROM GRPAPPLICATIONINSTANCES
                          where GRPAPPID = (select GRPAPPID
                                            from GRPAPPLICATIONS
                                            where GRPNAME = 'DIGITAL_OFFICE')
                            AND APPID in (select APPID from APPLICATIONS where REGEXP_LIKE(APPNAME, '[[:digit:]]')))
        LOOP
            INSERT INTO ROLES (ROLID, ROLNAME, APPID)
            VALUES (SEQROLES.nextval,
                    'INVENTORY_REQUESTER',
                    applicationId);
            INSERT INTO ROLES (ROLID, ROLNAME, APPID)
            VALUES (SEQROLES.nextval,
                    'INVENTORY_OWNER',
                    applicationId);
            INSERT INTO ROLES (ROLID, ROLNAME, APPID)
            VALUES (SEQROLES.nextval,
                    'INVENTORY_ADMIN',
                    applicationId);
        END LOOP;
    RETURN 1;
END;

alter function addNewRolesToAllGDP compile;

此语句在 USER_ERRORS 中为我​​提供以下信息:

PLS-00103:在预期以下之一时遇到符号“”:(返回压缩编译包装

【问题讨论】:

  • INSERT 语句中,您应该使用applicationId.APPID 而不是applicationId
  • dbfiddle中编译。
  • 您可以尝试将其编译为独立函数,可能会抛出错误,因为它是包的一部分并且前面的行会导致错误。
  • 例如,当上一行中的结束分号丢失时,Oracle在下一行显示错误。我不知道这里是否是这种情况,但是您的函数为我编译,正如您在 dbfiddle 中看到的那样,所以我猜该错误在其他地方。
  • 我在我的 oracle 数据库中使用了相同的 @PonderStibbons dbfiddle,并且工作起来就像一个魅力

标签: sql oracle


【解决方案1】:

我不确定这是否是问题所在,但我注意到函数的 END 语句后面没有斜杠。在 Oracle 工具中,如果没有斜线,语句实际上不会终止,并且 ALTER 命令包含在同一语句中。这可能会导致奇怪的语法错误。

如果这是问题所在,基本上这个问题是oracle SQL plus how to end command in SQL file?的重复。

编辑添加正如其他人在 cmets 中所说,当我从您的帖子中剪切并粘贴相同的代码时,我似乎编译得很好。根据错误和报告的位置,我最好的猜测是,在第一行的末尾,您的原始来源有一些导致解析器错误的不可见字符。

【讨论】:

    【解决方案2】:

    曾经在 Intellij 中运行它,它给了我所述的行为。从 sqlDeveloper 运行它后,它编译得很好。

    【讨论】:

      【解决方案3】:

      我收到了类似的错误消息,说明过程定义中缺少逗号,并在添加逗号后编译。

      修复前的程序定义

      PROCEDURE CREATE_WO(p_wo_type  IN NUMBER,
                                p_id     IN NUMBER,
                                p_do_commit        IN VARCHAR2 DEFAULT 'Y'
                                p_return_value     OUT VARCHAR2)
                                IS
          BEGIN   
            ...
         END;
      

      错误信息

      Cause: java.sql.SQLException: ORA-06550: line 8, column 9:
      PLS-00103: Encountered the symbol "" when expecting one of the following:
      
         ) , * & = - + < / > at in is mod remainder not rem =>
         <an exponent (**)> <> or != or ~= >= <= <> and or like like2
         like4 likec between || multiset member submultiset
      

      修复后的过程定义,注意p_do_commit末尾的逗号

      PROCEDURE CREATE_WO(p_wo_type  IN NUMBER,
                                p_id     IN NUMBER,
                                p_do_commit        IN VARCHAR2 DEFAULT 'Y',
                                p_return_value     OUT VARCHAR2)
                                IS
          BEGIN   
            ...
         END;
      

      【讨论】:

        猜你喜欢
        • 2018-01-23
        • 2016-11-05
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-03
        相关资源
        最近更新 更多