Oracle SQL 脚本 - 创建的包有编译错误

问题描述 投票:0回答:1

谁能告诉我这两个脚本是什么导致“创建时出现编译错误”。警告?我们正在使用 Oracle db 19c。执行“提交;”陈述以一种方式或另一种方式重要吗?我认为它们只需要用于创建、更新、删除等操作,但添加它们是因为我认为它不会造成伤害。我目前没有可以直接测试脚本的环境。谢谢!

create or replace PACKAGE PNM_WS_ADS_CONTRACT_ENTITIES AS
  
PROCEDURE GET_INFO
(
  PNM_P_ADS_CE_ID IN VARCHAR2
, PNM_P_ADS_CE_VERSION_NUMBER IN VARCHAR2 DEFAULT NULL
, PNM_P_ADS_CE_INFO_CUR OUT SYS_REFCURSOR
, PNM_P_RETURNCD OUT VARCHAR2
, PNM_P_RETURNMSG OUT VARCHAR2
) ;

PROCEDURE GET_NETWORKS
(
  PNM_P_ADS_CE_ID IN VARCHAR2
, PNM_P_ADS_CE_VERSION_NUMBER IN VARCHAR2 DEFAULT NULL
, PNM_P_ADS_CE_NETWORK_CUR OUT SYS_REFCURSOR
, PNM_P_RETURNCD OUT VARCHAR2
, PNM_P_RETURNMSG OUT VARCHAR2
) ;

END PNM_WS_ADS_CONTRACT_ENTITIES;

COMMIT;
create or replace PACKAGE BODY PNM_WS_ADS_CONTRACT_ENTITIES                                                                                                                         "PNM_WS_ADS_CONTRACT_ENTITIES" AS

PROCEDURE GET_INFO
(
  PNM_P_ADS_CE_ID IN VARCHAR2
, PNM_P_ADS_CE_VERSION_NUMBER IN VARCHAR2 DEFAULT NULL
, PNM_P_ADS_CE_INFO_CUR OUT SYS_REFCURSOR
, PNM_P_RETURNCD OUT VARCHAR2
, PNM_P_RETURNMSG OUT VARCHAR2
) AS

PNM_L_CE_INFO_QUERY VARCHAR2(2000);

BEGIN

PNM_L_CE_INFO_QUERY:= '';

IF  PNM_P_ADS_CE_ID IS NOT NULL THEN
open PNM_P_ADS_CE_INFO_CUR for
SELECT 1 FROM DUAL;
ELSE
PNM_P_RETURNCD := '1001';
PNM_P_RETURNMSG := 'INAVALID REQUEST';
RETURN;
END IF;

PNM_P_RETURNCD := '1000';
PNM_P_RETURNMSG := 'SUCCESS';
EXCEPTION
   WHEN OTHERS THEN
      PNM_P_RETURNCD := SQLCODE;
      PNM_P_RETURNMSG := SUBSTR(SQLERRM, 1, 100);

  END GET_INFO;


PROCEDURE GET_NETWORKS
(
  PNM_P_ADS_CE_ID IN VARCHAR2
, PNM_P_ADS_CE_VERSION_NUMBER IN VARCHAR2 DEFAULT NULL
, PNM_P_ADS_CE_NETWORK_CUR OUT SYS_REFCURSOR
, PNM_P_RETURNCD OUT VARCHAR2
, PNM_P_RETURNMSG OUT VARCHAR2
) AS

PNM_L_CE_NETWORK_QUERY VARCHAR2(2000);

BEGIN

PNM_L_CE_NETWORK_QUERY:= '';

IF  PNM_P_ADS_CE_ID IS NOT NULL THEN
open PNM_P_ADS_CE_NETWORK_CUR for
SELECT DISTINCT CE.SRC_CONTRACT_ENTITY_ID,
  CE.CONTRACT_ENTITY_NAME,
  CONT.ADS_CONTRACT_ID,
  NET.NETWORK_NAME,
  HP.HEALTHPLAN_NAME,
  CONT.CONTRACT_NUMBER,
  CONT.CONTRACT_STATUS,
  CONT.TARGET_PERCENT,
  CONT.FORECAST_PERCENT,
  CONT.ACTUAL_PERCENT,
  CONT.IN_PATIENT_RATE,
  CONT.OUT_PATIENT_RATE,
  CONT.FIRST_SIGNATURE_DT,
  CONT.EST_CONTRACT_CLOSE_DT,
  CONT.CONTRACT_CLOSE_DT,
  CONT.CONTRACT_NAME,
  CONT.EFFECTIVE_DT,
  CONT.IN_PATIENT_RATE,
  CONT.OUT_PATIENT_RATE,
  CONT.PROV_REQUESTED,
  CONT.NETWORK_ADEQ,
  CONT.HIGH_PERF_PROV,
  CONT.TIER_PRIORITY,
  CONT.PHASE,
  CONT.ACCEPT,
  CONT.CONTRACT_TYPE,
  NET.ADS_NETWORK_ID,
  NW.LINE_OF_BUSINESS,
  NW.NEGOTIATED_LANGUAGE,
  NW.NEGOTIATED_RATES,
  NW.CAPITATION,
  NW.CONTRACT_TYPE CONTRACT_CATEGORY
FROM PLMSTAGE.V_ADS_CL_CONTRACT_ENTITY CE
LEFT JOIN PLMSTAGE.V_ADS_CL_XF_CE_CNTRCT_NET NW
ON CE.ADS_CONTRACT_ENTITY_ID = NW.ADS_CONTRACT_ENTITY_ID
INNER JOIN PLMSTAGE.V_ADS_CL_XF_CE_NW XREF_CE_NET
ON XREF_CE_NET.ADS_CONTRACT_ENTITY_ID = CE.ADS_CONTRACT_ENTITY_ID
AND XREF_CE_NET.ADS_NETWORK_ID        = NW.ADS_NETWORK_ID
INNER JOIN PLMSTAGE.V_ADS_CL_NETWORK NET
ON XREF_CE_NET.ADS_NETWORK_ID = NET.ADS_NETWORK_ID
LEFT JOIN PLMSTAGE.V_ADS_CL_HEALTHPLAN HP
ON NW.ADS_HEALTHPLAN_ID = HP.ADS_HEALTHPLAN_ID
LEFT JOIN PLMSTAGE.V_ADS_CL_CONTRACT CONT
ON NW.ADS_CONTRACT_ID = CONT.ADS_CONTRACT_ID
WHERE CE.ADS_CONTRACT_ENTITY_ID = PNM_P_ADS_CE_ID;
ELSE
PNM_P_RETURNCD := '1001';
PNM_P_RETURNMSG := 'INAVALID REQUEST';
RETURN;
END IF;

PNM_P_RETURNCD := '1000';
PNM_P_RETURNMSG := 'SUCCESS';
EXCEPTION
   WHEN OTHERS THEN
      PNM_P_RETURNCD := SQLCODE;
      PNM_P_RETURNMSG := SUBSTR(SQLERRM, 1, 100);
END GET_NETWORKS; 

END PNM_WS_ADS_CONTRACT_ENTITIES;

COMMIT;
oracle19c sql-scripts
1个回答
0
投票

COMMIT;
陈述是这样还是那样重要?

不,

COMMIT
声明无关紧要。当您运行 DDL 语句(包括
CREATE PACKAGE
CREATE PACKAGE BODY
)时,数据库将发出隐式
COMMIT
语句,因此您将尝试创建包,隐式
COMMIT
,包编译(或失败)然后明确的
COMMIT
s,这是不必要的,因为
COMMIT
没有任何意义。


但是,您需要在新行上用

/
终止PL/SQL块;所以,在包装规格和正文的最后,你应该有:

END PNM_WS_ADS_CONTRACT_ENTITIES;
/

因为

CREATE PACKAGE
语句没有终止,所以你会从它后面的
COMMIT
语句中得到一个语法错误,因为它是意外的。如果您终止了包体/规范,那么
COMMIT
将是多余的(不必要但相对无害)但是因为您没有终止它所以它成为先前声明的一部分。


此外,根据您用来与数据库通信的数据库驱动程序,如果您返回游标而不打开它,您可能会遇到其他运行时错误。

可能还有其他错误,但我没有您的表格可以测试。

© www.soinside.com 2019 - 2024. All rights reserved.