【问题标题】:Getting an error -> found 'begin' expecting external language出现错误 -> 发现“开始”期待外部语言
【发布时间】:2021-09-21 00:35:15
【问题描述】:

我正在包内创建一个过程,但在执行以下脚本时出现以下错误

CREATE PACKAGE doc_interface AS

code_value                     VARCHAR2(30 CHAR)            ;

 PROCEDURE list_doc (
   lg_code    IN     fpl_ref.lang%TYPE,
   pl_no   IN     prt_req.pl_no%TYPE,
   cl_no    IN     prt_req.cl_no%TYPE,
   ct_no           IN      prt_req.ct_no%TYPE,
   potab_doc_list       OUT  custDocTab)
AS
BEGIN
   potab_doc_list := NEW custDocTab();

   IF pl_no IS NOT NULL AND cl_no IS NULL
   THEN
      select *
        BULK COLLECT INTO potab_doc_list
        from cs_record where req_id = 19736543;                          
   
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      z_error ('Error while fetching records =' || SQLERRM);
END list_doc;

END doc_interface;

错误:

[错误] 语法检查 (12: 0):错误第 13 行,第 1 列,第 13 行结尾,第 5 列结尾,找到“开始”,期望:外部语言

不理解它在之后期待什么而不是BEGIN。

【问题讨论】:

    标签: oracle plsql package procedure toad


    【解决方案1】:

    您使用`CREATE PACKAGE 显示的代码正在创建一个包规范 - 但您已经包含了属于包主体的过程主体。您需要分别创建规范和正文:

    CREATE PACKAGE doc_interface AS
    
    code_value                     VARCHAR2(30 CHAR)            ;
    
     PROCEDURE list_doc (
       lg_code    IN     fpl_ref.lang%TYPE,
       pl_no   IN     prt_req.pl_no%TYPE,
       cl_no    IN     prt_req.cl_no%TYPE,
       ct_no           IN      prt_req.ct_no%TYPE,
       potab_doc_list       OUT  custDocTab);
    
    END doc_interface;
    /
    

    然后

    CREATE PACKAGE BODY doc_interface AS
    
     PROCEDURE list_doc (
       lg_code    IN     fpl_ref.lang%TYPE,
       pl_no   IN     prt_req.pl_no%TYPE,
       cl_no    IN     prt_req.cl_no%TYPE,
       ct_no           IN      prt_req.ct_no%TYPE,
       potab_doc_list       OUT  custDocTab)
    AS
    BEGIN
       potab_doc_list := NEW custDocTab();
    
       IF pl_no IS NOT NULL AND cl_no IS NULL
       THEN
          select *
            BULK COLLECT INTO potab_doc_list
            from cs_record where req_id = 19736543;                          
       
       END IF;
    EXCEPTION
       WHEN OTHERS
       THEN
          z_error ('Error while fetching records =' || SQLERRM);
    END list_doc;
    
    END doc_interface;
    /
    

    不清楚您是否希望在包规范中声明 code_value - 它将是公共的 - 还是在包主体中 - 它将是私有的。

    Read more about package structure:

    一个包总是有一个规范,它声明了可以从包外部引用的公共项。

    如果公共项包括游标或子程序,那么包也必须有一个主体。主体必须定义公共游标的查询和公共子程序的代码。主体还可以声明和定义无法从包外部引用但对于包的内部工作来说是必需的私有项。

    如果您确实有/需要规范级别的变量,也请阅读 package state。

    【讨论】:

    • 谢谢一百万 :)
    【解决方案2】:

    您没有将实现代码放在 PACKAGE (SPEC) 中,而是在 PACKAGE BODY 中定义。

    此外,如果您将 CODE_VALUE 放在正文与规范中,您将无法在包外引用它。

    更像-

    CREATE PACKAGE DOC_INTERFACE AS 
     code_value                     VARCHAR2(30 CHAR)            ;
    
     PROCEDURE list_doc (
       lg_code    IN     fpl_ref.lang%TYPE,
       pl_no   IN     prt_req.pl_no%TYPE,
       cl_no    IN     prt_req.cl_no%TYPE,
       ct_no           IN      prt_req.ct_no%TYPE,
       potab_doc_list       OUT  custDocTab);
    END DOC_INTERFACE;
    /
    
    
    CREATE PACKAGE BODY doc_interface AS
    
     PROCEDURE list_doc (
       lg_code    IN     fpl_ref.lang%TYPE,
       pl_no   IN     prt_req.pl_no%TYPE,
       cl_no    IN     prt_req.cl_no%TYPE,
       ct_no           IN      prt_req.ct_no%TYPE,
       potab_doc_list       OUT  custDocTab)
    AS
    BEGIN
       potab_doc_list := NEW custDocTab();
    
       IF pl_no IS NOT NULL AND cl_no IS NULL
       THEN
          select *
            BULK COLLECT INTO potab_doc_list
            from cs_record where req_id = 19736543;                          
       
       END IF;
    EXCEPTION
       WHEN OTHERS
       THEN
          z_error ('Error while fetching records =' || SQLERRM);
    END list_doc;
    
    END doc_interface;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2017-09-12
      相关资源
      最近更新 更多