我创建了一个包含多个过程的包。我试图从shell脚本调用此包。 我的包是在模式ADM下编写的。 包名称为:PK_COMPUTE_FIELDS。
CREATE OR REPLACE PACKAGE ADM.PK_COMPUTE_FIELDS AS
PROCEDURE computeBalTotal(p_prd_id in integer,p_seg_id IN integer);
PROCEDURE computeBilAmt(p_prd_id in integer,p_seg_id IN integer);
PROCEDURE computePaidAmt(p_prd_id in integer,p_seg_id IN integer);
END PK_COMPUTE_FIELDS ;
CREATE OR REPLACE PACKAGE BODY ADM.PK_COMPUTE_FIELDS
AS
PROCEDURE computeBalTotal(p_prd_id in integer,p_seg_id IN integer) IS
BEGIN
//derivation logic
END;
PROCEDURE computeBilAmt(p_prd_id in integer,p_seg_id IN integer) IS
BEGIN
//derivation logic
END;
PROCEDURE computePaidAmt(p_prd_id in integer,p_seg_id IN integer) IS
BEGIN
//derivation logic
END;
END PK_COMPUTE_FIELDS ;
我使用下面的shell脚本来调用此包
sqlplus -s <USER>/<PWD>@<DBNAME> <<EOF >> $LOG_NAME
set serveroutput on
whenever sqlerror exit failure rollback
DECLARE
P_PRD_ID NUMBER;
P_SEG_ID NUMBER;
BEGIN
P_PRD_ID := 1907;
P_SEG_ID := 1;
execute immediate ADM.PK_COMPUTE_FIELDS.computeBalTotal( P_PRD_ID, P_SEG_ID );
COMMIT;
END;
/
EOF
我收到错误信息:
ERROR at line 9:
ORA-06550: line 9, column 20:
PLS-00201: identifier 'ADM.PK_COMPUTE_FIELDS.computeBalTotal' must be declared
ORA-06550: line 9, column 2:
PL/SQL: Statement ignored
请指导我更正此问题。
答案 0 :(得分:2)
由于您已经有execute immediate
阻止,因此您无需BEGIN..END
来调用该过程。
将其更改为简单
ADM.PK_COMPUTE_FIELDS.computeBalTotal( P_PRD_ID, P_SEG_ID );
具有已知参数的过程可以直接在PL / SQL中调用,如上所述。
EXECUTE IMMEDIATE
用于执行动态SQL语句(select,insert,update,delete
等)或匿名PL / SQL块(使用BEGIN..END
;)的过程。只有在你有参数时才需要它:你事先不知道的表名,列名等。
如果要调用BEGIN..END
之外的过程(SQL * plus范围),
您可以使用EXECUTE
EXECUTE schema.pkg_name.proc_name(args)
或只是EXEC schema.pkg_name.proc_name(args)