在Oracle Package Body中使用Pragma
我想创建一个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; (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |