我已经将oracle数据库从10g迁移到了12c。从12c开始,oracle不支持PLSQL_V2_COMPATIBILITY参数。
此参数用于:https://www.safaribooksonline.com/library/view/oracle-database-administration/1565925165/re157.html
上述url中的突出点之一是:
PL/SQL编译器将允许在某些情况下在表达式上下文中使用OUT参数,例如,在赋值语句右侧的点限定名中。此行为仅限于作为记录的OUT参数的字段,以及SELECT语句的FROM列表中引用的OUT参数。
由于这一变化,我们的许多包都出现了错误,以前使用的函数都将记录作为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;
/错误:
请-00488 't_standardurlstype‘必须是类型。
这是否需要修改整个代码?比如不使用记录作为输出参数?是否有解决办法?
发布于 2016-06-08 09:28:17
对于您所展示的示例,只需将返回类型(此函数的返回类型;其他函数的可能的OUT参数类型)更改如下:
RETURN t_standardurlstype;以下列方式之一:
RETURN t_standardurlstype%type;或者更简单地说:
RETURN t_standardurl_tbl;您目前正在尝试返回变量t_standardurlstype,它是t_standardurl_tbl类型的一个实例。使用兼容性设置,它允许从变量中推断类型,但不能再这样做了。您可能不会在其他地方实际使用该变量--如果不能,则可以删除它的声明,如果使用上面的第二种形式的话。
因此,您需要对代码进行更改,但只需要在包规范和正文中声明返回参数和输出参数。您可以继续使用记录作为OUT参数,只需正确声明它。
不过,这种情况还有其他影响。有关详细信息,请参阅我的Oracle备注47354.1,但是总结一下上面的内容,您还需要注意这些改变的行为,就像PL/SQL现在:
return expression,应该是return type (这是您的问题中的代码击中的)。对于这些类,没有快速修复或魔术棒;如果您的代码依赖于这些类别中的任何旧行为,则必须修改它以遵守“新”语法规则。
https://stackoverflow.com/questions/37698214
复制相似问题