gpt4 book ai didi

oracle - 事务上下文中 Oracle 存储过程/函数的语义

转载 作者:行者123 更新时间:2023-12-02 07:07:53 24 4
gpt4 key购买 nike

我最近从一位同事那里得到了一些关于在存储函数中提交的意见。我们是否使用过程或函数在 Oracle 数据库中执行离线/批处理逻辑主要取决于我们应用程序的品味。在这两种情况下,我们都会返回代码作为函数结果或过程OUT 参数。我们通常要求从 PL/SQL 调用这些离线/批处理例程,而不是从 SQL:

-- good
declare
rc number(7);
begin
rc := our_function(1, 2, 3);
end;

-- less good
select our_function(1, 2, 3) from dual;

后者不太好的原因是 our_function 可能出于性能原因而提交事务。这对于批处理例程来说是可以的。

问题是:是否有围绕该主题的最佳实践,或者是否有一些特殊关键字可以防止在编译器级别的 SQL 语句中使用此类函数?或者我们应该避免使用批处理操作的函数而只​​使用过程?

最佳答案

您可以使用RESTRICT_REFERENCES指示函数不会读/写包或数据库状态。

CREATE PACKAGE t_pkg AS
FUNCTION showup (msg VARCHAR2) RETURN VARCHAR2;
PRAGMA RESTRICT_REFERENCES(showup, WNDS, RNDS);
END t_pkg;
/
-- create the package body
CREATE OR REPLACE PACKAGE BODY t_pkg AS
FUNCTION showup (msg VARCHAR2) RETURN VARCHAR2 IS
v_val varchar2(1);
BEGIN
select dummy into v_val from dual;
RETURN v_val;
END;
END t_pkg;
/

过去的情况是,SQL 不允许您调用函数,除非它作出这样的 promise ,但该限制已被删除。

我更愿意将其作为过程和函数之间的区别。值得记住的是,如果 PL/SQL 函数引发 NO_DATA_FOUND 异常,调用 SQL 语句不会失败(因为未找到数据并不是 SQL 错误)。因此我更喜欢使用过程,除非该对象是专门设计用于从 SQL 调用的。

关于oracle - 事务上下文中 Oracle 存储过程/函数的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6856743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com