Oracle创建包内存储过程遇Found 'BEGIN' expecting EXTERNAL LANGUAGE错误
错误原因
你触发语法错误的核心问题是混淆了Oracle中PACKAGE的包头(Specification)和包体(Body)的定义规则:
CREATE PACKAGE语句用于定义包头,仅允许声明包内的公共变量、常量、存储过程/函数的签名,不能写存储过程的具体实现代码。你把list_doc存储过程的完整实现(AS、BEGIN、逻辑代码、异常块这些)直接写在了包头里,不符合语法要求。- 存储过程的具体实现必须放在
CREATE PACKAGE BODY定义的包体中。
正确写法
首先先创建包头,代码如下:
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 OR REPLACE 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; /
报错提示说明
你收到的Found 'BEGIN', Expecting: EXTERNAL LANGUAGE提示,是因为Oracle解析包头时发现你在过程签名后写了不属于包头的AS关键字,系统误以为你要定义调用外部语言的存储过程,才会要求你输入EXTERNAL LANGUAGE相关声明,本质和BEGIN关键字本身无关。
内容的提问来源于stack exchange,提问作者Vasudha Dixit
相关产品推荐
相关产品推荐

