gpt4 book ai didi

oracle - 在 Oracle 包体中使用 Pragma

转载 作者:行者123 更新时间:2023-12-04 22:37:46 25 4
gpt4 key购买 nike

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

没有编译指示,代码无法编译 (PLS-00231: function 'FUNCTION_PRIVATE' may not be used in 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也公开。是否有解决方案将编译指示添加到只能在包主体中找到的函数?

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

更新2 : Rob van Wijk 建议的代码中的错误修正。

最佳答案

您的问题与 PRAGMA 无关。正如 Rob 所说,现代 Oracle 版本会自动处理其中的大部分内容。

问题是您不能从 SQL 语句中调用私有(private)函数,甚至是嵌入在同一个包中的另一个子程序中的。 当 PL/SQL 执行 SQL 时,它被移交给 SQL 引擎执行,这实际上将您带到了包的范围之外,因此它无法访问私有(private)成员。

这编译得很好——没有编译指示,但是将“私有(private)”函数公开:

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;

如果你想保持函数私有(private),你需要看看你是否可以重写公共(public)函数,使得对私有(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(30);
BEGIN
ret := function_private(x);
SELECT 'x' || ret INTO ret FROM dual;
RETURN ret;
END;
END PRAGMA_TEST;

关于oracle - 在 Oracle 包体中使用 Pragma,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2801225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com