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' 语法规则。
我已经将 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' 语法规则。