从shell脚本调用包

时间:2018-01-12 18:14:35

标签: oracle unix plsql oracle12c

我创建了一个包含多个过程的包。我试图从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

请指导我更正此问题。

1 个答案:

答案 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)