从snowflake存储过程参数中获取JSON数据并插入目标表

67up9zun  于 2023-01-27  发布在  其他
关注(0)|答案(1)|浏览(162)

我需要在Stored Proc参数中接收JSON数据,并将其插入雪花目标表(user_json_feedback)。JSON数据有三个关键元素(User、EntityID和Entity Type),而目标表有五列(User、ID、Entity Type、Region和Date)。区域的默认值为“NA”,日期为当前日期。
如果插入成功,则返回true;否则返回false。
我在这里正在为语法和解析问题而挣扎,因为我对编写过程非常陌生。
下面是我一直在尝试做的事情,这显然给了我错误,但服务于我意图的算法。

CREATE OR REPLACE SP_UPDATE_JSON_DATA (JSON_DATA VARIANT)
RETURNS BOOLEAN 
LANGUAGE JAVASCRIPT
EXECUTE AS OWNER
AS 
$$   
//Declare variables  
var REGION = 'NA'
var V_DATE = `select current_date;`;
var DATE_STMT= snowflake.createStatement({sqlText: V_DATE });
var curr_date = DATE_STMT.execute();
var src_json = JSON.parse(JSON_DATA);    
var sql_command =
`INSERT INTO user_json_feedback (user,id,etype,region ,date)//
select src_json:USER,src_json:ENTITY_ID,src_json:ENTITY_TYPE,REGION,curr_date;`;
try {
    snowflake.execute (
        {sqlText: sql_command}
        );
    return "Succeeded.";   // Return a success/error indicator.
    }
catch (err)  {
    return "Failed: " + err;   // Return a success/error indicator.
    }
$$;

带参数的函数调用如下所示

call SP_UPDATE_JSON_DATA ('[{"USER":"XYZ","ENTITY_ID":"BMT0001","ENTITY_TYPE":"BMT"},{"USER":"ABC","ENTITY_ID":"BMT0002","ENTITY_TYPE":"BMT"}]');

提前感谢您的帮助!

pw9qyyiw

pw9qyyiw1#

这里有一些东西。
首先是获取当前日期的步骤。curr_date是一个结果集对象。要提取值并在以后使用它,您需要使用. next()读取第一行,然后使用GetColumnValue读取列内容。要在以后将其作为格式良好的字符串传递,您需要使用. toISOString()转换。
其次,在这种情况下,解析后的json返回一个数组,因此您需要迭代数组以插入单个记录。由于事先不知道变量是否包含数组,因此最好检查解析后的json是否为数组,并相应地进行处理
最后一个调整是改变返回类型,以便从返回调用中获得所期望的详细反馈。
更新代码:

CREATE OR REPLACE TEMPORARY TABLE user_json_feedback
(
     user   VARCHAR(100)     
    ,id     VARCHAR(100) 
    ,etype  VARCHAR(100)     
    ,region VARCHAR(100)     
    ,date   TIMESTAMP_NTZ
);

CREATE OR REPLACE TEMPORARY PROCEDURE SP_UPDATE_JSON_DATA(JSON_DATA VARIANT)
RETURNS STRING 
LANGUAGE JAVASCRIPT
EXECUTE AS OWNER
AS 
$$   
//Declare variables  
var REGION = 'NA'
var V_DATE = `select current_date;`;
var DATE_STMT= snowflake.createStatement({sqlText: V_DATE });
var DATE_STMT_RES = DATE_STMT.execute();
DATE_STMT_RES.next()
var curr_date = DATE_STMT_RES.getColumnValue(1).toISOString();
var src_json = JSON.parse(JSON_DATA);    

try {
    if (Array.isArray(src_json)){
        for (key in src_json){
            var sql_command =
            `INSERT INTO user_json_feedback (user,id,etype,region,date)//
            VALUES(:1,:2,:3,:4,:5)`;
            snowflake.execute (
                {
                    sqlText: sql_command,
                    binds: [src_json[key].USER,src_json[key].ENTITY_ID,src_json[key].ENTITY_TYPE,REGION,curr_date]
                }
            );
            }
        }
    else {
        var sql_command =
            `INSERT INTO user_json_feedback (user,id,etype,region,date)//
            VALUES(:1,:2,:3,:4,:5)`;
            snowflake.execute (
                {
                    sqlText: sql_command,
                    binds: [src_json.USER,src_json.ENTITY_ID,src_json.ENTITY_TYPE,REGION,curr_date]
                }
            );
        }
    return "Succeeded.";   // Return a success/error indicator.
    }
catch (err)  {
    return "Failed: " + err;   // Return a success/error indicator.
    }
$$;    

--Need to cast variable string as variant.
--ARRAY example
call SP_UPDATE_JSON_DATA ('[{"USER":"XYZ","ENTITY_ID":"BMT0001","ENTITY_TYPE":"BMT"},{"USER":"ABC","ENTITY_ID":"BMT0002","ENTITY_TYPE":"BMT"}]'::VARIANT);
--Single object example
call SP_UPDATE_JSON_DATA ('{"USER":"JST","ENTITY_ID":"BMT0003","ENTITY_TYPE":"BMT"}'::VARIANT);

SELECT *
FROM user_json_feedback;

结果集:

虽然所有这些都能起作用,但最好还是将整个变量插入到表中,并依靠snowflake强大的半结构化数据查询功能。当然,对于大负载,您会发现批量加载到表中的变量列,然后在视图中进行解析的性能要好得多。

相关问题