PL/SQL:使用pragma restrict_references限制包权限

本文解析了Oracle PL/SQL中的RESTRICT_REFERENCES Pragma作用及使用方法,通过实例展示了如何确保子程序不会更改数据库状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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), 而我却在这个函数的内部进行了写表操作,难怪为编译出错。


 RESTRICT_REFERENCES pragma的使用方法例如以下:

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

 

 keyword和參数描写叙述:

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

subprogram_namePL/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;
/
复制代码

 

 




本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5333219.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值