Snowflake 存储过程是否支持 if...exists?
Is if...exists supported in Snowflake stored procedures?
我写了一个存储过程,将从 python 调用。如果 id 不存在,存储过程需要将变体数据插入到我的 table 中,或者更新与 id 匹配的现有变体数据。 id 将按照变体数据的方式传递,但现在我只是想让它使用硬编码的 id。存储过程从 python 成功调用,但随后没有在存储过程中插入或更新任何内容,并且存储过程没有给我错误。我不确定是我做错了什么还是...
if exists (select * from my_database_table where my_variant_data:id::varchar = '123456')
...部分被忽略,因为它不受支持。我无法在文档中找到任何内容来证明或反驳这一点。有人知道吗?
create or replace procedure my_stored_procedure("variant_data" variant)
returns string
language javascript
strict
execute as owner
as
$$
var insert_update_query = `
if exists (select * from my_database_table where my_variant_data:id::varchar = '123456')
begin
update my_database_table SET my_variant_data = parse_json(:1)) WHERE my_variant_data:id::varchar = '123456'
end
else
begin
insert into my_database_table(my_variant_data) select (parse_json(:1));
end
`
var result = "";
try {
var sql_insert_update_query = snowflake.createStatement({
sqlText: insert_update_query
});
var insert_update_query_result = sql_insert_update_query.execute();
result += "\n Query succeeded";
} catch (err) {
result += "\n Query failed failed: " + err.code + "\n State: " + err.state;
result += "\n Message: " + err.message;
result += "\n Stack Trace:\n" + err.stackTraceTxt;
}
return result;
$$
;
我已经分别测试了存储过程中查询的插入和更新部分,它们工作正常。
插入 - 按预期工作。
create or replace procedure my_stored_procedure("variant_data" variant)
returns string
language javascript
strict
execute as owner
as
$$
var sql_command = "insert into my_database_table(my_variant_data) select (parse_json(:1));";
var sql = snowflake.createStatement( {sqlText: sql_command, binds:[JSON.stringify(variant_data)]});
var resultSet = sql.execute();
return sql_command;
$$
;
更新 - 按预期工作。
create or replace procedure my_stored_procedure("variant_data" variant)
returns string
language javascript
strict
execute as owner
as
$$
var sql_command = "UPDATE my_database_table SET my_variant_data = parse_json(:1)) WHERE my_variant_data:id::varchar = '123456'";
var sql = snowflake.createStatement( {sqlText: sql_command, binds:[JSON.stringify(variant_data)]});
var resultSet = sql.execute();
$$
;
鉴于 CODE executed 需要在控制台 运行s 上有效 SQL,而这个 if
不是,它基本上是 MERGE 命令我建议将代码翻转为 MERGE:
MERGE INTO my_database_table USING my_database_table
ON my_variant_data:id::varchar = '123456'
WHEN MATCHED THEN UPDATE SET my_variant_data = parse_json(:1))
WHEN NOT MATCHED THEN INSERT (my_variant_data) VALUES (parse_json(:1));
否则,如果您想要它在 SP space 中,那么我会倾向于将代码分解为 SELECT x INTO varaible FROM blar
模式,然后让 IF 在 SP 中并在两个块之间进行选择SQL 到 运行。但鉴于它只是一个合并,我还是会再次进行合并。
我写了一个存储过程,将从 python 调用。如果 id 不存在,存储过程需要将变体数据插入到我的 table 中,或者更新与 id 匹配的现有变体数据。 id 将按照变体数据的方式传递,但现在我只是想让它使用硬编码的 id。存储过程从 python 成功调用,但随后没有在存储过程中插入或更新任何内容,并且存储过程没有给我错误。我不确定是我做错了什么还是...
if exists (select * from my_database_table where my_variant_data:id::varchar = '123456')
...部分被忽略,因为它不受支持。我无法在文档中找到任何内容来证明或反驳这一点。有人知道吗?
create or replace procedure my_stored_procedure("variant_data" variant)
returns string
language javascript
strict
execute as owner
as
$$
var insert_update_query = `
if exists (select * from my_database_table where my_variant_data:id::varchar = '123456')
begin
update my_database_table SET my_variant_data = parse_json(:1)) WHERE my_variant_data:id::varchar = '123456'
end
else
begin
insert into my_database_table(my_variant_data) select (parse_json(:1));
end
`
var result = "";
try {
var sql_insert_update_query = snowflake.createStatement({
sqlText: insert_update_query
});
var insert_update_query_result = sql_insert_update_query.execute();
result += "\n Query succeeded";
} catch (err) {
result += "\n Query failed failed: " + err.code + "\n State: " + err.state;
result += "\n Message: " + err.message;
result += "\n Stack Trace:\n" + err.stackTraceTxt;
}
return result;
$$
;
我已经分别测试了存储过程中查询的插入和更新部分,它们工作正常。
插入 - 按预期工作。
create or replace procedure my_stored_procedure("variant_data" variant)
returns string
language javascript
strict
execute as owner
as
$$
var sql_command = "insert into my_database_table(my_variant_data) select (parse_json(:1));";
var sql = snowflake.createStatement( {sqlText: sql_command, binds:[JSON.stringify(variant_data)]});
var resultSet = sql.execute();
return sql_command;
$$
;
更新 - 按预期工作。
create or replace procedure my_stored_procedure("variant_data" variant)
returns string
language javascript
strict
execute as owner
as
$$
var sql_command = "UPDATE my_database_table SET my_variant_data = parse_json(:1)) WHERE my_variant_data:id::varchar = '123456'";
var sql = snowflake.createStatement( {sqlText: sql_command, binds:[JSON.stringify(variant_data)]});
var resultSet = sql.execute();
$$
;
鉴于 CODE executed 需要在控制台 运行s 上有效 SQL,而这个 if
不是,它基本上是 MERGE 命令我建议将代码翻转为 MERGE:
MERGE INTO my_database_table USING my_database_table
ON my_variant_data:id::varchar = '123456'
WHEN MATCHED THEN UPDATE SET my_variant_data = parse_json(:1))
WHEN NOT MATCHED THEN INSERT (my_variant_data) VALUES (parse_json(:1));
否则,如果您想要它在 SP space 中,那么我会倾向于将代码分解为 SELECT x INTO varaible FROM blar
模式,然后让 IF 在 SP 中并在两个块之间进行选择SQL 到 运行。但鉴于它只是一个合并,我还是会再次进行合并。