加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

在Oracle Package Body中使用Pragma

发布时间:2021-04-01 16:55:46 所属栏目:站长百科 来源:网络整理
导读:我想创建一个Oracle Package和两个函数:一个公共函数(function_public)和一个私有函数(function_private). public函数在sql语句中使用私有函数. 没有编译指示代码不编译(PLS-00231:函数’FUNCTION_PRIVATE’可能不在SQL中使用) CREATE OR REPLACE PACKAGE

我想创建一个Oracle Package和两个函数:一个公共函数(function_public)和一个私有函数(function_private). public函数在sql语句中使用私有函数.

没有编译指示代码不编译(PLS-00231:函数’FUNCTION_PRIVATE’可能不在SQL中使用)

CREATE OR REPLACE PACKAGE PRAGMA_TEST AS
  FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2;
END PRAGMA_TEST;

CREATE OR REPLACE PACKAGE BODY PRAGMA_TEST AS
  FUNCTION function_private(y IN VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
     return 'z';
  END;

  FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2 IS
  ret VARCHAR2(100);
  BEGIN
     SELECT 'x' || function_private(x) INTO ret FROM dual;
     return ret;
  END;
END PRAGMA_TEST;

如果我将WNDS,WNPS编译指示添加到function_private,代码将编译.在我看来pragma只能在包声明中使用,而不能在包体中使用,所以我必须在包中声明function_private:

CREATE OR REPLACE PACKAGE PRAGMA_TEST AS
  FUNCTION function_private(y IN VARCHAR2) RETURN VARCHAR2;
  PRAGMA RESTRICT_REFERENCES( function_private,WNDS,WNPS);
  FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2;
END PRAGMA_TEST;

CREATE OR REPLACE PACKAGE BODY PRAGMA_TEST AS
  FUNCTION function_private(y IN VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
     return 'z';
  END;

  FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2 IS
  ret VARCHAR2(100);
  BEGIN
     SELECT 'x' || function_private(x) INTO ret FROM dual;
     return ret;
  END;
END PRAGMA_TEST;

这个解决方案也使我的function_private公开.是否有解决方案将pragma添加到只能在包体中找到的函数?

更新:用一个工作(简化)示例替换伪代码.

UPDATE2:Rob van Wijk建议的代码中的错误修正.

解决方法

你的问题与PRAGMAs无关.正如Rob所说,现代Oracle版本会自动处理大部分内容.

问题是你不能从SQL语句中调用私有函数,即使是嵌入在同一个包中的另一个子程序中的私有函数.当PL / SQL执行SQL时,它会被传递给SQL引擎执行,这实际上会将您带到包的范围之外,因此它无法访问私有成员.

这编译很好 – 没有编译指示,但公开“私人”功能:

CREATE OR REPLACE PACKAGE PRAGMA_TEST AS
  FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2;
  FUNCTION function_private(y IN VARCHAR2) RETURN VARCHAR2;
END PRAGMA_TEST;


CREATE OR REPLACE PACKAGE BODY PRAGMA_TEST AS
  FUNCTION function_private(y IN VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
     return 'z';
  END;

  FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2 IS
     ret VARCHAR2(30);
  BEGIN
     SELECT 'x' || function_private(x) INTO ret FROM dual;
     RETURN ret;
  END;
END PRAGMA_TEST;

如果要将该函数保持为私有,则需要查看是否可以重写public函数,以便在SQL语句之外完成对private函数的调用:

CREATE OR REPLACE PACKAGE PRAGMA_TEST AS
  FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2;
END PRAGMA_TEST;


CREATE OR REPLACE PACKAGE BODY PRAGMA_TEST AS
  FUNCTION function_private(y IN VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
     return 'z';
  END;

  FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2 IS
     ret VARCHAR2(30);
  BEGIN
     ret := function_private(x);
     SELECT 'x' || ret INTO ret FROM dual;
     RETURN ret;
  END;
END PRAGMA_TEST;

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!