Oracle的PLS-00231 錯誤分析

來源:互聯網
上載者:User

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方式調用函數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.