作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将 PRAGMA RESTRICT_REFERENCES 添加到包中的过程(例如,RNPS)。该过程实现在表中插入一行。
该表有一个前插入触发器。该触发器从包中读取变量并将其放入:new.my_column。
我可以毫无问题地编译包体,即使它看起来实际上是从包变量中读取值。
当我执行该程序时,它确实有效。但这是开发环境,通常没有多个同时连接。我担心这可能会在生产环境中失败。
那么,我应该担心,还是这真的有效?
示例代码:
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;
最佳答案
RNPS
仅对函数有用,因为它告诉编译器,如果同时没有包状态(或其他编译指示的数据库状态)发生更改,则函数的返回值在调用之间不会更改。它允许缓存,但比 RESULT_CACHE
更隐式或 DETERMINISTIC
(这是现在告诉优化器期望什么的首选方式)。
因为你在一个过程中使用它,所以它并不重要。您可以在不更改包装规范的情况下安全地进行操作。但是,由于您(或您的继任者)可能会在一年后问自己同样的问题,因此您不妨在使用时立即更改软件包。
关于sql - RESTRICT_REFERENCES 和触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36313290/
我将 PRAGMA RESTRICT_REFERENCES 添加到包中的过程(例如,RNPS)。该过程实现在表中插入一行。 该表有一个前插入触发器。该触发器从包中读取变量并将其放入:new.my_co
我是一名优秀的程序员,十分优秀!