我已将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参数?是否有任何解决方案?
答案 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传递到另一个过程。
这些没有快速修复或魔术棒;如果您的代码依赖于任何这些类别中的任何旧行为,则必须对其进行修改以遵守“新”行为。语法规则。