如何使用雪花存储过程将变量数据传递到雪花表中

Posted

技术标签:

【中文标题】如何使用雪花存储过程将变量数据传递到雪花表中【英文标题】:how to pass variant data into snowflake table using snowflake stored procedure 【发布时间】:2021-08-02 16:56:55 【问题描述】:

我可以知道。

CREATE
OR REPLACE PROCEDURE abc(
    MY_ID STRING,
    P_FILTERS VARIANT
) RETURNS VARIANT 
LANGUAGE javascript as $$
try

var P_FILTERS=P_FILTERS;

    var query=" INSERT INTO abc (SQ_ID,id,\  
                                      FILTERS,\
                                      ITERATION)\
        VALUES (abc.nextval,\
                :1,\
                :2,\
                0); "
var sql = snowflake.createStatement( sqlText: query,binds:[MY_ID,P_FILTERS] );
    var resultSet = sql.execute();
  COMMIT;  


catch(error)

    return (error);

$$;

有人可以帮忙告诉我吗

谢谢, 尼基尔

【问题讨论】:

【参考方案1】:

解决方案并不完全简单,但是从变体到字符串再到变体可以解决问题:

create or replace temp table variants as 
select 'a'::string id, parse_json('"hello":"world"') v
;

CREATE
OR REPLACE PROCEDURE insert_variant(
    MY_ID STRING,
    P_FILTERS VARIANT
) RETURNS VARIANT 
LANGUAGE JAVASCRIPT as $$
var query="INSERT INTO variants (id, v) select :1, parse_json(:2); "
var sql = snowflake.createStatement(
    sqlText: query
    , binds:[MY_ID, JSON.stringify(P_FILTERS)]
);

var resultSet = sql.execute();
$$;

call insert_variant('c', parse_json('"hello2":"world3"'))
;

这是因为

目前,只能绑定数字、字符串和 SfDate 类型的 JavaScript 变量。 https://docs.snowflake.com/en/sql-reference/stored-procedures-usage.html#binding-variables

如果尝试在插入的 VALUES() 部分解析 JSON,则会出现错误“VALUES 子句中的表达式无效”。但是使用 INSERT+SELECT 可以解决问题。

【讨论】:

以上是关于如何使用雪花存储过程将变量数据传递到雪花表中的主要内容,如果未能解决你的问题,请参考以下文章

使用雪花中的存储过程将值插入表中

避免雪花中存储过程的重复

雪花上的 SQL 存储过程将绑定列视为字符串,并且它没有从表中获取其值

我们可以使用雪花中的存储过程将文件从文件位置加载到命名内部阶段吗?

使用传递的变量插入表雪花

如何评估雪花存储过程中的语句