Tus*_*rde 3 snowflake-cloud-data-platform
我想了解我们在过程创建期间使用VOLATILE和IMMUTABLE关键字的行为
根据文档,我已经理解了这个理论
但我试图了解这两个关键字的实际表现。
我尝试过以下示例
示例 -不可变
CREATE or REPLACE PROCEDURE HELLO_WORLD()
RETURNS VARIANT
LANGUAGE JAVASCRIPT
IMMUTABLE
AS
$$
var sql_command =
"select id, name from emp";
try {
var stmt = snowflake.execute (
{sqlText: sql_command}
);
var a = []
while (stmt.next()){
a.push(stmt.getColumnValue(1))
}
return a;
}
catch (err) {
return "Failed: " + err;
}
$$;
CALL HELLO_WORLD();
Run Code Online (Sandbox Code Playgroud)
示例 -易失性
CREATE or REPLACE PROCEDURE HELLO_WORLD()
RETURNS VARIANT
LANGUAGE JAVASCRIPT
VOLATILE
AS
$$
var sql_command =
"select id, name from emp";
try {
var stmt = snowflake.execute (
{sqlText: sql_command}
);
var a = []
while (stmt.next()){
a.push(stmt.getColumnValue(1))
}
return a;
}
catch (err) {
return "Failed: " + err;
}
$$;
CALL HELLO_WORLD();
Run Code Online (Sandbox Code Playgroud)
两者返回相同的输出
[ 3, 2, 1 ]
Run Code Online (Sandbox Code Playgroud)
谁能用任何不同的例子来解释一下吗?
也许使用 UDF(而不是存储过程,但语义是相同的)更容易理解差异:
create or replace function x(a string)
returns float
language javascript
immutable -- replace with volatile
as '
return Math.random();
';
select x('1')
from table(generator(rowcount => 5))
Run Code Online (Sandbox Code Playgroud)
当函数不可变时: select 返回 5 个相同的随机数。
当函数易失时: select 返回 5 个不同的随机数。
也许存储过程的文档应该说“该过程可能为相同的输入返回不同的值”,而不是“该过程可能为不同的行返回不同的值”。
| 归档时间: |
|
| 查看次数: |
688 次 |
| 最近记录: |