在Oracle Package Body中使用Pragma

在Oracle Package Body中使用Pragma,第1张

概述我想创建一个Oracle Package和两个函数:一个公共函数(function_public)和一个私有函数(function_private). public函数在sql语句中使用私有函数. 没有编译指示代码不编译(PLS-00231:函数’FUNCTION_PRIVATE’可能不在SQL中使用) CREATE OR REPLACE PACKAGE PRAGMA_TEST AS FUNC 我想创建一个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;
总结

以上是内存溢出为你收集整理的在Oracle Package Body中使用Pragma全部内容,希望文章能够帮你解决在Oracle Package Body中使用Pragma所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1166942.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存