zoukankan      html  css  js  c++  java
  • [PLSQL] RESTRICT_REFERENCES Pragma

    在看别人的代码的时候,发现了如下的编译指令,


    pragma restrict_references(get_attribute_name, wnds);

    get_attribute_name是一个pl/sql function, 当我试图在这个函数中往一个log表里面插入log信息的时候,编译都通不过,给出如下信息,


    Error(
    2252,1): PLS-00452: Subprogram 'GET_AMOUNT_NAME' violates its associated pragma 

    看来就是上面这个pragma搞得鬼。 查了下Oracle 文档, (http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/restrictreferences_pragma.htm#LNPLS01339) 

    才知道这个pragma的作用是保证上面的那个function,不会改变数据库的状态 wnds (Write No Database State), 而我却在这个函数的内部进行了写表操作,难怪为编译出错。

    不过从文档上得知,这个pragma是deprecated,  Oracle推荐用DETERMINISTIC 和 PARALLEL_ENABLE来取代这个pragma. 关于deterministic,在另外一篇日志中提到过。

     

     RESTRICT_REFERENCES pragma的用法如下

     PRAGMA RESTRICT_REFERENCES ( subprogram_name, [RNDS, WNDS, RNPS, WNPS, TRUST])

     关键字和参数描述:

    PRAGMA: 表示这是一个编译指令,在编译的时候执行

    subprogram_name: PL/SQL 函数的名字

    RNDS: (Read No Database State) 表示该subprogram不会查询(query)数据库中的表。

    WNDS: (Write No Database State) 表示该subprogram不会改变数据库中的表的数据。

    RNPS: (Read No Package State) 不访问包中的变量

    WNPS:(Write No Package State) 不改变包中的变量值

    TRUST: 表示信任该subprogram不会违反前面的任何约束,一般用在PL/SQL调用外部函数,比如java代码。

    需要注意的是, RESTRICT_REFERENCES pragma只能出现在package specification 或者 object type specification. 

    下面是一个简单的例子,


    CREATE PACKAGE loans AS
       
    FUNCTION credit_ok RETURN BOOLEAN;
       
    PRAGMA RESTRICT_REFERENCES (credit_ok, WNDS, RNPS);
    END loans;
    /



    --------------------------------------
    Regards,
    FangwenYu
  • 相关阅读:
    STL
    Makefile
    配置pyqt5环境 for python3.4 on Linux Mint 17.1
    SELinux Policy Macros
    python爬虫
    python常用模块
    python中if __name__ == '__main__':
    Centos 7 .Net core后台守护进程Supervisor配置
    阅读Google Protocol Buffers 指南,整理pb语法
    Google Protocol Buffers 入门
  • 原文地址:https://www.cnblogs.com/fangwenyu/p/1684545.html
Copyright © 2011-2022 走看看