【问题标题】:Expecting external language error in PL/SQL block预期 PL/SQL 块中有外部语言错误
【发布时间】:2018-03-23 22:54:52
【问题描述】:

您好,我正在编写一个数据转换函数,但似乎我遇到了一个我一生都无法弄清楚的语法错误。此外,如果您发现我可以在我的代码中做出任何错误或改进,请告诉我。我得到的错误是FOUND V_GMIN expecting: EXTERNAL LANGUAGE

CREATE OR REPLACE PACKAGE pkg_user_info
IS

  function get_gmin(i_user_id IN EZ01USERMAST.USER_ID%TYPE)
    RETURN VARCHAR2
  IS
    V_GMIN EZ01USERMAST.GMIN;
  BEGIN

    select GMIN 
     into V_GMIN
     from EZ01USERMAST
    where user_id= i_user_id
     and rownum = 1;

    return V_GMIN;

  EXCEPTION WHEN OTHERS THEN
    return null; 
  END get_gmin;

 end pkg_user;
 /

【问题讨论】:

    标签: oracle plsql compiler-errors package syntax-error


    【解决方案1】:

    此外,如果您真的想创建一个包而不仅仅是一个函数,那么一个包由两部分组成,一个规范和一个主体。您在 end 语句中给出的名称与顶部的 create 语句中的名称不同。我冒昧地编辑了代码,因此选择位于它自己的匿名块中,并且会引发任何异常。仍然可以使用更好的错误处理,但我会留给你。作为一项规则,也尽量从一个地方返回。

    CREATE OR REPLACE PACKAGE pkg_user_info AS
      function get_gmin(i_user_id IN EZ01USERMAST.USER_ID%TYPE) RETURN EZ01USERMAST.USER_ID%TYPE;
    END pkg_user_info;
    /
    
    CREATE OR REPLACE PACKAGE BODY pkg_user_info AS
      function get_gmin(i_user_id IN EZ01USERMAST.USER_ID%TYPE) RETURN EZ01USERMAST.USER_ID%TYPE IS
    
        V_GMIN EZ01USERMAST.USER_ID%TYPE := NULL;
    
        BEGIN
          BEGIN 
            select GMIN 
            into V_GMIN
            from EZ01USERMAST
            where user_id = i_user_id
            and rownum = 1;
          EXCEPTION 
            WHEN OTHERS THEN 
              RAISE;
          END;
          RETURN V_GMIN;
    
       END get_gmin;
    
    END pkg_user_info;
    /
    

    【讨论】:

    • 非常感谢您的帮助,由于某些奇怪的原因,此脚本编译时出错。好的开始,我会研究它
    • 很抱歉再次打扰您。当我将此函数编写为匿名块时,一切正常,但由于某种原因,当我将此函数作为包的一部分包含时,我遇到了同样的错误?有什么线索吗?
    • @Jules - 嗯。您没有显示的包示例还有更多内容吗?我想知道这个错误是否是由看不见的代码引起的?错误是在编译时还是在运行时抛出的?请包括确切的错误文本。 GMIN 是否与 EZ01USERMAST.USER_ID 相同的数据类型?
    • @Jules - 等一下,您是在复制和粘贴上面窗口中显示的我的代码吗?如果是这样,让我在单独的创建语句之后添加斜杠,以便它们以正确的顺序运行。可能就是这样。
    • 我修复了 gary 的问题,只是我必须做一些清理工作。谢谢你的帮助老兄
    【解决方案2】:

    以下是一些样式和语法提示:

    • 当其他人返回 null 时;这只会吞噬可能发生的任何和所有错误。它可能会导致数小时的痛苦调试。试试

      当其他时候 --使用自治事务日志包记录错误 增加; 结束;

    • V_GMIN EZ01USERMAST.GMIN;什么是 EZ01USERMAST.GMIN?你是说 EZ01USERMAST.GMIN%type 吗?
    • 为什么在选择 user_id 时要加上 rownum =1?如果我有两个具有相同 ID 的用户,我会想知道它。

    【讨论】:

      【解决方案3】:

      这里的问题是你忘记在body的包声明中放入关键字BODY。编译器期望这里有一个规范声明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-04
        • 2016-05-16
        • 1970-01-01
        相关资源
        最近更新 更多