当我试图编译这个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;
2条答案
按热度按时间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';
ffdz8vbo2#
这是关键:
使用包时,必须有包规范。包体是可选的。
在你的例子中,你的情况正好相反--你试图创建一个实体,但没有规范。
我的schema中肯定没有这个包,所以-如果我尝试先创建body,我会得到和你一样的错误:
假设程序代码写对了,你只需要先创建包规范(你说你有;即使你这样做了,它也是无效的。正确地创建它应该不会太困难):
现在创建包规范(即运行你发布的有问题的代码)。我没有你的表和过程(也不想创建它们),但是-正如我所说的-如果过程代码是好的,一切都应该编译:
顺便说一下,将
OUT
参数值设置为FAIL
并没有多大帮助。您确实知道出错了,但不知道是什么。也许您宁愿让Oracle引发错误,或者至少返回SQLERRM
。