【问题标题】:How to create an Oracle package with private procedure?如何使用私有过程创建 Oracle 包?
【发布时间】:2021-07-05 20:11:23
【问题描述】:

我正在创建一个 Oracle 包,我想知道是否可以将程序设为私有,这是我的示例代码:

CREATE OR REPLACE PACKAGE MYSCHEMA.MyPackage AS
 PROCEDURE MyProcedureA(outputParam OUT VARCHAR2);
 PROCEDURE MyProcedureB(inputParam IN VARCHAR2);
END MyPackage;

/

CREATE OR REPLACE PACKAGE BODY MYSCHEMA.MyPackage AS

 PROCEDURE MyProcedureA(outputParam OUT VARCHAR2) AS
  myHello VARCHAR2(1000) := 'Hello';
 BEGIN
  MyProcedureB(myHello);
  outputParam := 'OK';
 END MyProcedureA;

 PROCEDURE MyProcedureB(inputParam IN VARCHAR2) AS
  myWorld VARCHAR2(1000) := 'World';
 BEGIN
  dbms_output.put_line(inputParam || myWorld);
 END MyProcedureB;

END MyPackage;

是否可以将 MyProcedureB 设为“私有”,我的意思是它只能由包中的其他过程 (MyProcedureA) 调用?

【问题讨论】:

    标签: sql oracle plsql plsqldeveloper plsql-package


    【解决方案1】:

    当然。包规范中未声明的任何内容都是私有的。

    然而,一旦你从包规范中删除了MyProcedureB,你将在MyProcedureA 中调用它之前对其进行声明。我通常更喜欢在包体中将MyProcedureB 的实现放在MyProcedureA 的实现之前。

    CREATE OR REPLACE PACKAGE MYSCHEMA.MyPackage AS
     PROCEDURE MyProcedureA(outputParam OUT VARCHAR2);
    END MyPackage;
    
    /
    
    CREATE OR REPLACE PACKAGE BODY MYSCHEMA.MyPackage AS
    
     PROCEDURE MyProcedureB(inputParam IN VARCHAR2) AS
      myWorld VARCHAR2(1000) := 'World';
     BEGIN
      dbms_output.put_line(inputParam || myWorld);
     END MyProcedureB;
    
     PROCEDURE MyProcedureA(outputParam OUT VARCHAR2) AS
      myHello VARCHAR2(1000) := 'Hello';
     BEGIN
      MyProcedureB(myHello);
      outputParam := 'OK';
     END MyProcedureA;
    
    END MyPackage;
    

    您也可以按原样保留订单,只需在包体顶部声明该过程的规范

    CREATE OR REPLACE PACKAGE MYSCHEMA.MyPackage AS
     PROCEDURE MyProcedureA(outputParam OUT VARCHAR2);
    END MyPackage;
    
    /
    
    CREATE OR REPLACE PACKAGE BODY MYSCHEMA.MyPackage AS
     PROCEDURE MyProcedureB(inputParam IN VARCHAR2);
    
     PROCEDURE MyProcedureA(outputParam OUT VARCHAR2) AS
      myHello VARCHAR2(1000) := 'Hello';
     BEGIN
      MyProcedureB(myHello);
      outputParam := 'OK';
     END MyProcedureA;
    
     PROCEDURE MyProcedureB(inputParam IN VARCHAR2) AS
      myWorld VARCHAR2(1000) := 'World';
     BEGIN
      dbms_output.put_line(inputParam || myWorld);
     END MyProcedureB;
    
    END MyPackage;
    

    【讨论】:

      猜你喜欢
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      相关资源
      最近更新 更多