PLSQL_V2_COMPATIBILITY兼容性

时间:2016-06-08 09:15:38

标签: oracle plsql oracle12c

我已将oracle数据库从10g迁移到12c。从12c开始,oracle不支持PLSQL_V2_COMPATIBILITY参数。

此参数用于: https://www.safaribooksonline.com/library/view/oracle-database-administration/1565925165/re157.html

上面网址中的一个突出显示点是:

  

PL / SQL编译器将允许在表达式中使用OUT参数   在某些情况下,例如,在点上的点限定名称中的上下文   赋值语句的右侧。此行为受到限制   到作为记录的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'必须是类型。

这是否需要整个代码更改?喜欢不将记录作为out参数?是否有任何解决方案?

1 个答案:

答案 0 :(得分: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传递到另一个过程。

这些没有快速修复或魔术棒;如果您的代码依赖于任何这些类别中的任何旧行为,则必须对其进行修改以遵守“新”行为。语法规则。