如何将变体值传递给雪花存储过程中的插入语句

用户6866797

我的目标:允许用户将 JSON 字符串传递给 Snowflake 存储过程。然后,我希望存储过程将字符串转换为变体数据类型,并将值插入到表中具有变体数据类型的字段中。

我尝试过的:

  • 将用户的值包装在 parse_json(),to_variant() 中并进行转换(val as VARIANT)
  • 我已经使用绑定方法尝试了上述所有函数,并使用字符串和变量的组合构造了一个 sql 语句,但没有成功

我的代码如下。您可以为我提供任何帮助将不胜感激,谢谢!


CREATE OR REPLACE PROCEDURE LOGGING_TEST_PR (ETL_NAME VARCHAR(16777216),ETL_RUN_GUID VARCHAR(16777216),TASK_NAME VARCHAR(16777216),RECORDS FLOAT8,RUN_DATA_JSON VARCHAR(16777216) )
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//USER INPUT VARIABLES
var USER_JOB_NAME = ETL_NAME.toLowerCase(),USER_JOB_RUN_GUID = ETL_RUN_GUID, USER_JOB_TASK_NAME = TASK_NAME.toLowerCase(),USER_JOB_RECORDS, USER_JOB_RUN_DATA_JSON;

//SQL_STATEMENT_COUNT VARIABLES
var SQL_STATEMENT_COUNT,SQL_COUNT,RECORD_COUNT;

//SQL_STATEMENT_INSERT VARIABLES
var SQL_INSERT_RECORD, SQL_INSERT, ROW_NUM_INSERT, RESULT_INSERT_RETVALUE;

//SQL_STATEMENT_SELECT VARIABLES

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


//REVERT UNDEFNED VARIABLE VALUES BACK TO NULL
function NULL_PARAM(PARAM)
    {
    if (typeof PARAM === 'undefined')
        {
        return null;
        }
    else 
        {
        return PARAM;
        }
    }

USER_JOB_RECORDS = NULL_PARAM(RECORDS);
USER_JOB_RUN_DATA_JSON = NULL_PARAM(RUN_DATA_JSON);



//SQL STATEMENT VARIABLES
var SQL_STATEMENT_COUNT = " SELECT COUNT(*) AS COUNT FROM EDW_DEV.LOGGING.JOB_LOG_SPROC WHERE LOWER(ETL_NAME) ='" 
+ USER_JOB_NAME +"'"
+ " AND LOWER(ETL_RUN_GUID) ='" + USER_JOB_RUN_GUID +"'"
+ " AND LOWER(TASK_NAME) ='" + USER_JOB_TASK_NAME + "'"; 

var SQL_STATEMENT_SELECT = "SELECT LOWER(ETL_NAME) AS ETL_NAME,LOWER(ETL_RUN_GUID) AS ETL_RUN_GUID,LOWER(TASK_NAME) AS TASK_NAME,START_DTS,END_DTS FROM EDW_DEV.LOGGING.JOB_LOG_SPROC WHERE LOWER(ETL_NAME) ='" 
+ USER_JOB_NAME +"'"
+ " AND LOWER(ETL_RUN_GUID) ='" + USER_JOB_RUN_GUID +"'"
+ " AND LOWER(TASK_NAME) ='" + USER_JOB_TASK_NAME + "'"; 

var SQL_INSERT_RECORD = "INSERT INTO EDW_DEV.LOGGING.JOB_LOG_SPROC (ETL_NAME,ETL_RUN_GUID,TASK_NAME,START_DTS,RECORDS_START,RUN_DATA_JSON)"
+ "VALUES("+ "'" + USER_JOB_NAME + "'," +  "'" + USER_JOB_RUN_GUID + "'," + "'" + USER_JOB_TASK_NAME + "'," + "CONVERT_TIMEZONE('UTC', CAST(CURRENT_TIMESTAMP() AS TIMESTAMP_TZ(9)))" + "," 
+ USER_JOB_RECORDS + "," + USER_JOB_RUN_DATA_JSON + ")";

try {
//CHECK IF THE RECORD FOR THE TASK_NAME EXISTS IN THE TABLE
SQL_COUNT = snowflake.createStatement({sqlText:SQL_STATEMENT_COUNT});
RESULT_COUNT = SQL_COUNT.execute(); //EXECUTE MAH SQL STATEMENT
RESULT_COUNT.next(); //GO TO FIRST ROW IN RESULT SET
RECORD_COUNT = RESULT_COUNT.getColumnValue(1);



//THE TASK_NAME IS NOT IN THE TABLE
if (RECORD_COUNT == 0)
   {SQL_INSERT = snowflake.createStatement({sqlText:"INSERT INTO EDW_DEV.LOGGING.JOB_LOG_SPROC (ETL_NAME,ETL_RUN_GUID,TASK_NAME,RECORDS_START,RUN_DATA_JSON) VALUES(?,?,?,?,?);",
   binds:[USER_JOB_NAME,USER_JOB_RUN_GUID,USER_JOB_TASK_NAME,USER_JOB_RECORDS,CAST(USER_JOB_RUN_DATA_JSON AS VARIANT)]});
   INSERT_RESULT = SQL_INSERT.execute();
   ROW_NUM_INSERT = INSERT_RESULT.next();
   return RESULT_INSERT_RETVALUE = INSERT_RESULT.getColumnValue(1);
  }
//THE TASK NAME IS IN THE TABLE 
else if (RECORD_COUNT == 1)
  { return "UPDATE RECORD WITH END TIMESTAMP AND OPTIONAL COUNTS AND RUN DATA JSON"; } 
//RUH ROOOOOOO!
else 
{ return "THERE WAS AN UNFORSEEN ERROR.";}

}
catch (ERR) {
  return ERR
}
$$
CALL LOGGING_TEST_PR('WAYNE','15','BAGELS',1,'{"dude":"whoa"}') }
用户6866797

来自 Snowflake 的销售工程师:

 //create the table for inserting data
create table tester (json variant);


//adding a select statement with the parse_json I am able to insert values into the table in json format
insert into tester
    select parse_json(column1) as v
    from values ('{ "x" : "abc", "y" : false, "z": 10} ') 
       as vals;

//see the result
Select * from tester;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在使用Swift关闭ViewController的过程中,如何将值从ViewController B传递给ViewController A?

在雪花的 javascript 过程中传递值

如何将表中的值作为参数传递给存储过程?

如何在select语句后在mysql存储过程中插入值

存储过程中的雪花“get”语句不起作用

您可以在postgresql的存储过程中的插入语句中的临时行上引用聚合函数吗?

如何将字符串(varchar)传递到SQL存储过程中?

将变体数据传递给雪花

如何在包含两条插入语句的oracle中执行存储过程?

从C#,如何将Clob值传递给oracle存储过程

如何将表名,列名和值传递给存储过程

如何将选择查询的结果作为插入语句中的属性值插入

如何将输出参数传递给存储过程?

在从JavaScript到ASP.NET WebService的调用过程中,如何将“ NULL”值传递给可为空的字段

如何将python中mysql库中的参数传递给存储过程

如何将varchar字符串传递给条件中的存储过程?

如何将表参数传递给 EF Core 中的 SQL Server 存储过程?

如何将架构作为参数传递给SQL Server中的存储过程?

如何将整个 http URL 传递给 asp.net API 中的存储过程?

雪花存储过程中的可选参数

将查询传递给 postgres 中存储过程中的 row_to_json 函数

将DateTimePicker值传递给存储过程

将多个值传递给存储过程

如何将函数的结果用于插入语句?

如何将SQLite表导出为插入语句?

“ [RODBC]错误:无法执行SQLExecDirect”,因为过程中的插入语句

将参数传递给BigQuery存储过程中的外部查询

无法将字符串传递给存储过程中的IN子句

将数据表传递给存储过程中的表值参数不起作用