了解 Snowflake 中的程序 (javascript)
Understanding procedures in Snowflake (javascript)
我最近在分析第 3 方数据脚本时遇到了以下代码行。
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}) } )
.
object
.method
部分清楚。 binds
也一样。 binds
之后的代码是我的问题。
另一个主题:Snowflake 将方法的参数解释为 JSON。是不是可以通过赋值JS代码来扩展bind
值?
非常感谢您的帮助和解释。
我最初没有post这个作为答案的原因是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 不知道如何处理 undefined。
但这是我回答的理由。
我最近在分析第 3 方数据脚本时遇到了以下代码行。
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}) } )
.
object
.method
部分清楚。 binds
也一样。 binds
之后的代码是我的问题。
另一个主题:Snowflake 将方法的参数解释为 JSON。是不是可以通过赋值JS代码来扩展bind
值?
非常感谢您的帮助和解释。
我最初没有post这个作为答案的原因是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 不知道如何处理 undefined。 但这是我回答的理由。