【问题标题】:NONDETERMINISTIC function uses DETERMINISTIC functionNONDETERMINISTIC 函数使用 DETERMINISTIC 函数
【发布时间】:2020-01-17 07:23:11
【问题描述】:

我不确定以下函数的 DETERMINISTIC / NONDETERMINISTIC 定义。 function1 函数不是 DETERMINISTIC 但包括 DETERMINISTIC 函数 (function2)。由于内部具有 DETERMINISTIC 功能,我应该将其更改为 DETERMINISTIC 吗?

CREATE FUNCTION function1 (a varchar(12), bDate timestamp, cDate timestamp, insertCache bool, forceNotToUseCache bool, e INT(10), f INT(10))

**RETURNS DOUBLE
NOT DETERMINISTIC
READS SQL DATA**

BEGIN

DECLARE v_value double default null;

    IF (condition)
        THEN
            do stuff
        ELSE
            SELECT function2(a, bDate, cDate, insertCache, forceNotToUseCache) into v_value;
            RETURN(v_value);
    END IF;

提前致谢!

【问题讨论】:

  • 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称,存储过程是高度特定于供应商的。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS

标签: mysql sql stored-procedures


【解决方案1】:

从定义:

只要使用一组特定的输入值调用确定性函数并给定相同的数据库状态,它们总是返回相同的结果。每次使用一组特定的输入值调用非确定性函数时,它们可能会返回不同的结果,即使它们访问的数据库状态保持不变。

在您的情况下,如果您不直接返回 fuction2 的确定性结果,而是在您的 condition 中使用非确定性的结果,例如取决于当前日期,那么 function1 仍然是不确定的

希望对你有帮助。

【讨论】:

    【解决方案2】:

    我不确定 DETERMINISTIC / NONDETERMINISTIC 的定义

    ALL 动作/调用是确定性的 - 函数是确定性的。

    至少一个动作/调用不确定时 - 整个函数都不确定。


    例如,定义一个函数

    CREATE FUNCTION fn () 
    RETURNS INT 
    BEGIN 
        SET @tmp:=NOW(); -- non-deterministic call !
        RETURN 1; 
    END 
    

    因为确定性是意识形态错误,尽管它的结果是确定性的。

    【讨论】:

    • 这个函数仍然是确定性的,因为可观察到的效果是确定性的。
    • @MarkRotteveel 请区分“函数是确定性的”和“函数被声明为确定性的”。
    • 据我所知,您展示的函数可以声明为确定性的。
    • @MarkRotteveel 当然可以。由于上述原因,我永远不会亲自这样做。
    • @MarkRotteveel 综合场景。 A 用小的非确定性块创建巨大的函数,并将函数定义为非确定性的。然后方法暂时稍作改动,B已经注释掉了这个块。 С 搜索优化方式并将函数重新定义为确定性。更改到期,D 取消了这个块,但他错过的是函数被重新定义为确定性的。每个人都很高兴... :)
    猜你喜欢
    • 2013-06-27
    • 1970-01-01
    • 2011-06-22
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    相关资源
    最近更新 更多