首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RESTRICT_REFERENCES和触发器

RESTRICT_REFERENCES和触发器
EN

Stack Overflow用户
提问于 2016-03-30 15:28:18
回答 1查看 415关注 0票数 7

我将PRAGMA RESTRICT_REFERENCES添加到包中的过程中(例如,RNPS)。该过程实现在表中插入一行。

该表有一个前置插入触发器。该触发器从包中读取一个变量,并将其放入:new.my_column。

我可以毫无问题地编译包体,尽管它看起来实际上是从包变量中读取值。

当我执行这个过程时,它实际上是有效的。但这是一种发展环境,通常不存在多重同时连接。我担心这可能会在生产环境中失败。

所以,我是应该担心呢,还是真的可以呢?

示例代码:

代码语言:javascript
复制
CREATE TABLE MY_TABLE 
(
  ID VARCHAR2(20) NOT NULL 
, USER_ID VARCHAR2(50) 
, CONSTRAINT MY_TABLE_PK PRIMARY KEY 
  (
    ID 
  )
  ENABLE 
);

CREATE OR REPLACE PACKAGE PUSER IS

    PROCEDURE saveUser(
            pUserId VARCHAR2
        );
    PRAGMA RESTRICT_REFERENCES (saveUser, WNDS, RNDS, RNPS);

    FUNCTION getUser RETURN VARCHAR2;
    PRAGMA RESTRICT_REFERENCES (getUser, WNDS, RNDS, WNPS);

END PUSER;

CREATE OR REPLACE PACKAGE BODY PUSER AS

    userId VARCHAR2(50);

    PROCEDURE saveUser(
            pUserId VARCHAR2
        ) IS
    BEGIN
        userId := pUserId;
    END saveUser;

    FUNCTION getUser RETURN VARCHAR2 IS
    BEGIN
        RETURN userId;
    END getUser;

END PUSER;


CREATE OR REPLACE PACKAGE MY_PACKAGE IS

    PROCEDURE insertMyTable(
            pId VARCHAR2
        );
    PRAGMA RESTRICT_REFERENCES (insertMyTable, RNPS);

END MY_PACKAGE;

CREATE OR REPLACE PACKAGE BODY MY_PACKAGE AS

    PROCEDURE insertMyTable(
            pId VARCHAR2
        ) IS
    BEGIN
        INSERT INTO MY_TABLE(id) VALUES(pId);
    END insertMyTable;
END MY_PACKAGE;

CREATE OR REPLACE TRIGGER MY_TABLE_TRIGGER
BEFORE INSERT ON MY_TABLE FOR EACH ROW
DECLARE
BEGIN
    :new.USER_ID := PUSER.getUser;
END MY_TABLE_TRIGGER;

编辑:我知道RESTRICT_REFERENCES是不推荐的,但是知道这对于已经存在的代码仍然是有用的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-23 14:52:42

RNPS只对函数有用,因为它告诉编译器,如果没有改变包状态(或其他杂注的数据库状态),函数的返回值在调用之间不会发生变化。它允许缓存,但以一种比RESULT_CACHEDETERMINISTIC更隐式的方式(这现在是告诉优化器期望什么的首选方式)。

因为您在一个过程中使用它,这并不重要。您可以安全地进行,而不更改包规格。然而,由于你(或你的继任者)可能会在一年后问自己同样的问题,你最好现在就改变包。

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

https://stackoverflow.com/questions/36313290

复制
相关文章

相似问题

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