Oracle的PLS-00231 錯誤分析 ,這個錯誤一般是函數的存取權限導致的,在包頭聲明為共有函數則全票通過,在包體聲明的話位死於函數會導致錯誤。
create or replace function Two
return Number
is
begin
return 2;
end Two;
create or replace procedure PrintTwo
is
myNum Number;
begin
select Two()
into myNum
from dual;
dbms_output.put_line(myNum);
end PrintTwo;
以上函數和過程,放在函數和過程中聲明,調用正常。注意two函數被printtwo過程以sql語句形式調用。
若將此二程式段放入一個package中,函數私人方式,則包體編譯時間出錯,報pls-00231錯誤,函數不能在sql語句中使用之類。
原因為何?
pl sql和sql對於oracel而言,是兩個不同的引擎,因而對於sql引擎而言,plsql包中私人的two函數,是無法發現的。
所以包中使用two函數,方法有兩種:
1 在包頭聲明中聲明two函數,即將two函數作公有聲明,此時可以select two into mynum from dual;形式調用,當然這樣將無法隱藏two函數。
2 以mynum:=two;方式調用,由於此種方式以pl sql引擎解析,所以可以正常使用以私人方式聲明的two函數。
可見需以合適的方式將two函數暴露給sql或plsql引擎方可使用。那麼若不將two作公有聲明,而用包名.two方式調用,不一樣可定位到two函數?哦當然不行,你忘了two未作公有聲明,在包外無論如何都是不可見的哈哈。
那麼對於包內一個返回集合類型的函數,如:FUNCTION strsplit(p_list IN VARCHAR2, p_sep IN VARCHAR2 DEFAULT '|')
RETURN str_split
PIPELINED;
str_split為一個自訂集合類型:
TYPE "STR_SPLIT" IS TABLE OF VARCHAR2 (4000);
此時,無論將type str_split以公有,或私人方式 在包中聲明,均無法正常使用sql方式調用,由於返回為集合,也不能用plsql的kkk:=str_split方式調用。此時,只能將str_split定義為oracle的自訂資料類型:
create or replace TYPE "STR_SPLIT" IS TABLE OF VARCHAR2 (4000)
然後去除包內公有或私人的type str_split定義,即可使用sql方式調用函數。