了解雪花中的过程(javascript)

时间:2020-04-24 10:41:19

标签: javascript sql stored-procedures data-warehouse snowflake-cloud-data-platform

我最近在分析第三方数据脚本时遵循了以下代码行。

  CREATE OR REPLACE PROCEDURE WH.SCHEMA.PROCEDURE_NAME(DATE_OF_LOAD STRING) --input which will be binded later
  RETURNS STRING
  LANGUAGE javascript
  AS $$

   var drop_table = `drop table if exists TABLE_NAME;`; 
   var stmt_drop_table = snowflake.createStatement( {sqlText: drop_table} );
   var incremental_data =
     `CREATE TABLE AS <many arguments>

      WHERE P.CZAS_MODYF_SF >= :1 --this is where biding of DATE_OF_LOAD occurs)

   SELECT *, HASH(*) HASH FROM (
                             SELECT <arguments>
                            FROM CTE) q; `;

   var stmt_incremental_data = snowflake.createStatement( {sqlText: incremental_data,binds: [DATE_OF_LOAD ].map(function(x){return x === undefined ? null : x}) } );

   try {

    stmt_drop_table.execute();  
    stmt_incremental_data.execute(); 
    rtr = "Success!";
    return rtr;
    }

   catch (err) {

       return "Failed: " + err;
}  
$$
;

我面临的全部挑战是

var stmt_incremental_data = snowflake.createStatement( {sqlText: incremental_data,binds: [DATE_OF_LOAD ].map(function(x){return x === undefined ? null : x}) } )

objectmethod部分清晰可见。与binds相同。 binds之后的代码是我的问题。

另一个主题:Snowflake将方法的参数解释为JSON。这是否意味着可以通过分配JS代码来扩展bind值? 非常感谢您的帮助和解释。

1 个答案:

答案 0 :(得分:2)

我之初没有将其发布为答案的原因是JavaScript不是我的专业领域。我涉足了几个月。

但是为了了解发生了什么事情

[DATE_OF_LOAD ].map(function(x){return x === undefined ? null : x})

您需要对其进行分解:

 x === undefined ? null : x

这称为elvis operator,它等效于:

if (x === undefined) 
{ 
  return null
} else { 
  return x 
} 

现在我们知道函数的功能,我们需要了解map方法。简而言之,它会创建一个新数组,并在调用数组中的每个元素上调用提供的函数。

因此,从我的评论中复制的简单答案是: 如果未定义DATE_OF_LOAD,则将其替换为null,否则它将使用DATE_OF_LOAD中存储的任何值。那是因为SQL不知道如何处理未定义的。 但是,这就是我回答的原因。