PL/SQL 块中预期出现外部语言错误

Expecting external language error in PL/SQL block

您好,我正在编写一个数据转换函数,但似乎出现了一个语法错误,我这辈子都无法弄清楚。另外,如果您发现我可以在我的代码中做出任何错误或改进,请告诉我。我得到的错误是 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;
 /

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

  • WHEN OTHERS THEN return null;这只会吞下所有可能发生的错误。它可能会导致数小时的痛苦调试。尝试

    当其他人那么 --使用自主事务日志包记录错误 增加; 结束;

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

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

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;
/

这里的问题是你忘记在body的包声明中放入关键字BODY。编译器需要此处的规范声明。