oracle PL/SQL编译错误

insrf1ej  于 2023-04-11  发布在  Oracle
关注(0)|答案(2)|浏览(285)

当我试图编译这个PL/SQL存储过程包时,我面临着下面的错误。我已经从另一个来源获得了shell并根据我的需要进行了调整,我不确定我还需要在哪里创建这个?我对PL/SQL非常陌生...

Package Body DEPLETION_ERRORS_MONTHLY_PKG compiled

LINE/COL  ERROR
--------- -------------------------------------------------------------
0/0       PL/SQL: Compilation unit analysis terminated
1/16      PLS-00201: identifier 'DEPLETION_ERRORS_MONTHLY_PKG' must be declared
1/16      PLS-00304: cannot compile body of 'DEPLETION_ERRORS_MONTHLY_PKG' without its specification
Errors: check compiler log

create or replace PACKAGE BODY  "DEPLETION_ERRORS_MONTHLY_PKG" AS
PROCEDURE RUN_SQL( OFF_Set IN NUMBER,

P_ERP_TBL  OUT XXTRANING_ERPTASK_TBL_TYPE,

STATUS OUT VARCHAR2)

IS

BEGIN

Select   XXTRAINING_ERPTASK_REC_TYPE

(

subinventory,
source_code||'-'||trx_reference (source_casenum_line), 
item_number,
item_description, 
error_msg,
filename,
creation_date,
quantity_used,
quantity_wasted,
INV_ITEM_FLAG,
INV_CATEGORY_NAME
)

BULK COLLECT INTO P_ERP_TBL from TGC_INT016_INV_DEPL_FBDI

where 1=1 
 and status='ERROR' 
 and creation_date >= add_months(trunc(sysdate,'mm'),-1) 
 and creation_date < trunc(sysdate, 'mm')
ORDER BY CREATION_DATE
OFFSET OFF_Set ROWS
FETCH NEXT 10000 ROWS ONLY;

STATUS:='SUCCESS';

COMMIT;

EXCEPTION WHEN OTHERS THEN

STATUS:='FAIL';

END;

END DEPLETION_ERRORS_MONTHLY_PKG;
qij5mzcb

qij5mzcb1#

在尝试再次编译包体之前,请检查包的规范并编译它。
您可以检查包规范是否在数据库中。
SELECT * FROM ALL_OBJECTS WHERE OBJECT_NAME = 'DEPLETION_ERRORS_MONTHLY_PKG' AND OBJECT_TYPE = 'PACKAGE';
如果查询没有返回任何结果,则表示包规范不存在。
如果规范存在,则规范中可能存在错误。您可以使用此查询检查错误。
SELECT * FROM ALL_ERRORS WHERE NAME = 'DEPLETION_ERRORS_MONTHLY_PKG' AND TYPE = 'PACKAGE';

ffdz8vbo

ffdz8vbo2#

这是关键:

1/16      PLS-00304: cannot compile body of 'DEPLETION_ERRORS_MONTHLY_PKG' without its specification

使用包时,必须有包规范。包体是可选的。
在你的例子中,你的情况正好相反--你试图创建一个实体,但没有规范。
我的schema中肯定没有这个包,所以-如果我尝试先创建body,我会得到和你一样的错误:

SQL> CREATE OR REPLACE PACKAGE BODY depletion_errors_monthly_pkg AS
  2    PROCEDURE run_sql( off_set    IN  NUMBER,
  3                       p_erp_tbl  OUT xxtraning_erptask_tbl_type,
  4                       status     OUT VARCHAR2)
  5    IS
  6    BEGIN
  7      null;
  8    END run_sql;
  9  END depletion_errors_monthly_pkg ;
 10  /

Warning: Package Body created with compilation errors.

SQL>
SQL> show err
Errors for PACKAGE BODY DEPLETION_ERRORS_MONTHLY_PKG:

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0      PL/SQL: Compilation unit analysis terminated
1/14     PLS-00201: identifier 'DEPLETION_ERRORS_MONTHLY_PKG' must be
         declared

1/14     PLS-00304: cannot compile body of 'DEPLETION_ERRORS_MONTHLY_PKG'
         without its specification

SQL>

假设程序代码写对了,你只需要先创建包规范(你说你有;即使你这样做了,它也是无效的。正确地创建它应该不会太困难):

SQL> CREATE OR REPLACE PACKAGE  depletion_errors_monthly_pkg AS
  2    PROCEDURE run_sql( off_set    IN  NUMBER,
  3                       p_erp_tbl  OUT xxtraning_erptask_tbl_type,
  4                       status     OUT VARCHAR2);
  5  END depletion_errors_monthly_pkg ;
  6  /

Package created.

现在创建包规范(即运行你发布的有问题的代码)。我没有你的表和过程(也不想创建它们),但是-正如我所说的-如果过程代码是好的,一切都应该编译:

SQL> CREATE OR REPLACE PACKAGE BODY depletion_errors_monthly_pkg AS
  2    PROCEDURE run_sql( off_set    IN  NUMBER,
  3                       p_erp_tbl  OUT xxtraning_erptask_tbl_type,
  4                       status     OUT VARCHAR2)
  5    IS
  6    BEGIN
  7      null;
  8    END run_sql;
  9  END depletion_errors_monthly_pkg ;
 10  /

Package body created.

SQL>

顺便说一下,将OUT参数值设置为FAIL并没有多大帮助。您确实知道出错了,但不知道是什么。也许您宁愿让Oracle引发错误,或者至少返回SQLERRM

相关问题