我想創建一個Oracle包和兩個函數:公共函數(function_public
)和私有函數(function_private
)。公共函數在sql語句中使用私有函數。在Oracle包體中使用Pragma
沒有編譯的代碼不能編譯(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
。在我看來,編譯只能在包聲明中使用,而不是在包身上,所以我必須在包裝申報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
公衆以及。有沒有解決方案可以將編譯指示添加到只能在包體中找到的函數?
UPDATE:代替僞代碼與工作(簡化的)例子。
UPDATE2:由Rob van Wijk建議的代碼中的錯誤修正。
您的示例不起作用。變量ret沒有聲明,你的函數沒有返回語句。而且:這似乎不是一個關於雜注的問題。您的函數無法編譯,因爲您嘗試在SQL中調用function_private。私有函數永遠不能從SQL中調用,所以它無論如何都需要公開。 – 2010-05-10 12:00:47