首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PLSQL_V2_COMPATIBILITY兼容性

PLSQL_V2_COMPATIBILITY兼容性
EN

Stack Overflow用户
提问于 2016-06-08 09:15:37
回答 1查看 190关注 0票数 3

我已经将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参数。

代码语言:javascript
复制
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‘必须是类型。

这是否需要修改整个代码?比如不使用记录作为输出参数?是否有解决办法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-08 09:28:17

对于您所展示的示例,只需将返回类型(此函数的返回类型;其他函数的可能的OUT参数类型)更改如下:

代码语言:javascript
复制
    RETURN   t_standardurlstype;

以下列方式之一:

代码语言:javascript
复制
    RETURN   t_standardurlstype%type;

或者更简单地说:

代码语言:javascript
复制
    RETURN   t_standardurl_tbl;

您目前正在尝试返回变量t_standardurlstype,它是t_standardurl_tbl类型的一个实例。使用兼容性设置,它允许从变量中推断类型,但不能再这样做了。您可能不会在其他地方实际使用该变量--如果不能,则可以删除它的声明,如果使用上面的第二种形式的话。

因此,您需要对代码进行更改,但只需要在包规范和正文中声明返回参数和输出参数。您可以继续使用记录作为OUT参数,只需正确声明它。

不过,这种情况还有其他影响。有关详细信息,请参阅我的Oracle备注47354.1,但是总结一下上面的内容,您还需要注意这些改变的行为,就像PL/SQL现在:

  • 正确地强制执行IN参数的只读语义,并且不允许索引表方法修改作为in参数传入的索引表。
  • 不允许在表达式上下文中使用外部参数。
  • 将不允许在SELECT列表的FROM子句中输出参数,在其中读取它们的值。
  • 将返回一个错误的非法语法return expression,应该是return type (这是您的问题中的代码击中的)。
  • 不允许将IN参数作为OUT传递到另一个过程。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37698214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档