2016-06-08 193 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

谢谢亚历克斯。很好的解释。 –