【问题标题】:Oracle SQL script - Package created with compilation errorsOracle SQL 脚本 - 创建的包有编译错误
【发布时间】:2023-02-21 00:15:26
【问题描述】:

谁能告诉我这两个脚本是什么导致“创建时出现编译错误”。警告?我们正在使用 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】:

    COMMIT; 声明是这样还是那样重要?

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


    但是,您需要在新行中使用 / 终止 PL/SQL 块;所以,在包规格和主体的末尾,你应该有:

    END PNM_WS_ADS_CONTRACT_ENTITIES;
    /
    

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


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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      相关资源
      最近更新 更多