PLSQL_V2_COMPATIBILITY 兼容性

PLSQL_V2_COMPATIBILITY Compatibility

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

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

上面url中的亮点之一是:

The PL/SQL compiler will allow OUT parameters to be used in expression contexts in some cases, for example, in dot-qualified names on the right-hand side of assignment statements. This behaviour is restricted to fields of OUT parameters that are records, and OUT parameters referenced in the FROM list of a SELECT statement.

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

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

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

对于您展示的示例,您只需将 return 类型(对于此函数;对于其他函数可能是 OUT 参数类型)更改为:

    RETURN   t_standardurlstype;

至:

    RETURN   t_standardurlstype%type;

或更简单地说:

    RETURN   t_standardurl_tbl;

您当前正在尝试 return 变量 t_standardurlstype,它是 t_standardurl_tbl 类型的 实例 。使用 PLSQL_V2_COMPATIBILITY setting 它允许从变量中推断出类型,但你不能再这样做了。您实际上可能没有在其他任何地方使用该变量 - 如果没有,您可以删除它的声明,如果您使用上面的第二种形式。

所以是的,您需要更改代码,但仅更改 return 和 OUT 参数在包规范和主体中的声明方式。你可以继续使用记录作为OUT参数,只需要正确声明即可。

不过,该设置还有其他含义。有关详细信息,请参阅 My Oracle Support 说明 47354.1,但总结了其中的内容,您还需要注意这些已更改的行为,如 PL/SQL 现在:

  • 正确地强制执行 IN 参数的只读语义,并且不允许索引 table 方法修改作为 IN 参数传入的索引 tables。

  • 不允许在表达式上下文中使用 OUT 参数。

  • 不允许在 SELECT 列表的 FROM 子句中读取参数值。

  • 会 return 非法语法错误 return expression 应该是 return type (这就是你问题中的代码所命中的)。

  • 不允许将 IN 参数作为 OUT 传递到另一个过程。

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