您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

确定程序

语法

create procedure add (in a int, in b int, out c int) deterministic as begin

c = :a + :b;

end

描述

如果满足以下条件,则可以在创建新过程时使用关键字 DETERMINISTIC:

  • 当使用相同的输入参数调用过程时,该过程始终返回相同的输出参数,即使会话和数据库状态不相同。

  • 该过程没有副作用。

    还可以通过更改配置部分中描述的配置参数,创建关键字为 DETERMINISTIC 的过程,即使它不满足上述条件。使用关键字 DETERMINISTIC 创建的过程被描述为“确定性过程”,无论它们在逻辑上是否确定。

    缺省情况下,无法创建包含以下内容的确定性过程:

  • 非确定性函数(例如,rand()、rand_secure()、session_context()、session_user、sysuid)

  • 具有副作用的语句(例如,隐式结果集、DML、DDL、commit/rollback/exec)

  • 读取/写入持久性对象(例如,序列)

  • 调用非确定性函数或过程

    根据责任创建确定性程序时,您可以跳过确定性检查。当您想要创建可能包含非确定性语句的逻辑确定性过程时,此命令非常有用。禁用检查时,请注意可以在用户之间共享缓存,因此,如果过程结果取决于当前用户(例如,过程安全性是调用者,并且存在用户特定的函数或使用具有分析权限的表),则它可能不会按预期运行。不建议禁用检查。

    如果确定性过程在逻辑上是非确定性的,则可能需要以下内容:

  • 如果确定性过程具有副作用,则在调用该过程时,副作用可能可见,也可能不可见。

  • 如果确定性过程具有隐式结果集,则在调用过程时可能会返回,也可能不返回它们。

  • 如果确定性过程为同一输入参数返回不同的输出参数,则在使用相同输入参数多次调用该过程时,可能会获得相同的输出参数,也可能无法获得相同的输出参数。

    配置

    以下配置参数参考 "sqlscript" 部分下的过程结果缓存 (PRC)。

    名称价值缺省描述procedure_result_cache_gc_interval0-429496729560PRC 垃圾收集之间的分钟数。当此值更改时,下一个 GC 将在指定分钟后运行。将此值设置为 0(不推荐)将无限期暂停垃圾回收,直到设置非零值。 