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 Libraries怎么翻译?
pycharm 提示 ennble Code compatibility inspection(代码兼容性检查)
sql ASM兼容性https://www.pythian.com/blog/oracle-11g-asm-diskgroup-compatibility/