PLSQL_V2_COMPATIBILITY 兼容性

Posted

技术标签:

【中文标题】PLSQL_V2_COMPATIBILITY 兼容性【英文标题】:PLSQL_V2_COMPATIBILITY Compatibility 【发布时间】:2016-06-08 09:15:37 【问题描述】:

我已将 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 列表中引用。

由于这一变化,我们的许多包都出现了错误,以前使用带有记录作为输出参数的函数。

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' 必须是类型。

这是否需要更改整个代码?喜欢不使用记录作为输出参数?有没有办法解决这个问题?

【问题讨论】:

【参考方案1】:

对于您展示的示例,您只需将返回类型(对于这个函数;对于其他函数可能是 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 传递到另一个过程。

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

【讨论】:

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

以上是关于PLSQL_V2_COMPATIBILITY 兼容性的主要内容,如果未能解决你的问题,请参考以下文章

compatibility是啥意思

英语Compatibility Libraries怎么翻译?

pycharm 提示 ennble Code compatibility inspection(代码兼容性检查)

sql ASM兼容性https://www.pythian.com/blog/oracle-11g-asm-diskgroup-compatibility/

Compatibility Telemetry(CompatTelRunner.exe) 占用硬盘100%困扰

怎么在BIOS中把serial ata模式改成compatibility模式