谁能告诉我这两个脚本是什么导致“创建时出现编译错误”。警告?我们正在使用 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;
陈述是这样还是那样重要?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
将是多余的(不必要但相对无害)但是因为您没有终止它所以它成为先前声明的一部分。
此外,根据您用来与数据库通信的数据库驱动程序,如果您返回游标而不打开它,您可能会遇到其他运行时错误。
可能还有其他错误,但我没有您的表格可以测试。