2016-06-08 192 views
3

我已將Oracle數據庫從10g遷移到12c。從12c開始,oracle不支持PLSQL_V2_COMPATIBILITY參數。PLSQL_V2_COMPATIBILITY兼容性

此參數用於: https://www.safaribooksonline.com/library/view/oracle-database-administration/1565925165/re157.html

一個在上述URL中的突出顯示點的是:要在表達在一些使用 上下文

的PL/SQL編譯器將允許OUT參數例如,在賦值語句右側 的點限定名稱中。此行爲受限於 到OUT參數的字段,這些記錄是在SELECT語句的FROM列表中引用的OUT參數 。

由於此更改,我們的許多軟件包出現了錯誤,以前使用帶有記錄的功能作爲輸出參數。

CREATE OR REPLACE Package SJMUSER.nagendra AS 

    TYPE r_standard_url IS RECORD  (
        v_loginurl  VARCHAR2(1000), 
        v_changepasswordurl VARCHAR2(1000), 
        v_newloginurl  VARCHAR2(1000) 
        ); 

    TYPE t_standardurl_tbl IS TABLE OF r_standard_url 
    INDEX BY BINARY_INTEGER; 

    t_standardurlstype  t_standardurl_tbl; 

     FUNCTION Producestandardurls 
       (
       tp_myuserid  IN USERS.User_Id%TYPE, 
       v_scrntime  IN VARCHAR2, 
       v_scrntoken  IN VARCHAR2, 
       v_wwikey  IN VARCHAR2 
       ) 
    RETURN t_standardurlstype; 


end nagendra; 
/

錯誤:

PLS-00488 't_standardurlstype' 必須是類型。

是否需要整個代碼更改?像不使用記錄作爲輸出參數?是否有任何解決方案?

回答

4

對於你的例子中,你只需要改變的返回類型(此功能;潛在OUT他人蔘數類型)來源:

RETURN t_standardurlstype; 

要麼:

RETURN t_standardurlstype%type; 

或者更簡單地說:

RETURN t_standardurl_tbl; 

你正在試圖返回變量t_standardurlstype,這是t_standardurl_tbl類型的實例。使用PLSQL_V2_COMPATIBILITY setting它允許從變量中推斷出類型,但不能再這樣做。您可能實際上並未在其他地方使用該變量 - 如果不是,則可以刪除其聲明,如果使用上面的第二個表單。

所以是的,你將需要改變代碼,但只需要聲明返回和OUT參數在包規範和正文中。您可以繼續使用記錄作爲OUT參數,只需要正確聲明即可。

雖然還有其他的影響。請參閱My Oracle Support說明47354.1有關詳細信息,但總結什麼,說,你還需要注意這些改變的行爲,因爲現在的PL/SQL:

  • 正確強制IN參數和只讀語義不會讓索引表方法修改作爲IN參數傳入的索引表。

  • 不允許OUT參數在表達式上下文中使用。

  • 將不允許在SELECT列表的FROM子句中讀取其值的OUT參數。

  • 將在非法語法return expression上返回一個錯誤,該錯誤應該是return type(這是您問題中的代碼所擊中的內容)。

  • 不允許將IN參數作爲OUT傳遞給另一個過程。

這些沒有快速修復或魔術棒;如果你的代碼依賴於任何這些類別中的任何舊行爲,那麼它將不得不被修改以遵守「新」語法規則。

+1

謝謝亞歷克斯。很好的解釋。 –