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 到 运行。但鉴于它只是一个合并,我还是会再次进行合并。