我是javascript的新手,snowflake在存储过程中使用类似js的语法。
我正在尝试创建动态SQL,以便它在start_date到end_date之间循环,以便根据日期从不同的s3文件夹复制到其中。
CREATE PROCEDURE load_dynamic_s3path_to_table(begin_date strings, end_date strings)
AS
$$
var stmt = snowflake.createStatement(
{sqlText: "copy into table from s3://test/2020-01-01/"}
);
var rs = stmt.execute();
$$;基于存储过程中的日期参数,例如begin_date 2020-01-01、end_date 2020-01-03。
我想执行3次copy into命令;
copy into table from s3://test/2020-01-01/
copy into table from s3://test/2020-01-02/
copy into table from s3://test/2020-01-03/我把伪代码想象成这样:
CREATE PROCEDURE load_dynamic_s3path_to_table(begin_date strings, end_date strings)
AS
$$
var dates = begin_date
while date(dates)>=date(begin_date) and date(dates)<date(end_date)
var stmt = snowflake.createStatement(
{sqlText: "copy into table from s3://test/" + dates}
);
var rs = stmt.execute();
dates+=1
$$;有没有人可以帮助把伪代码转换成正确的js语法和雪花中的可执行文件?
谢谢!
发布于 2021-01-26 08:01:16
在JavaScript中管理日期并不是一件容易的事,但是这个存储过程可以做您想要的事情:
CREATE OR REPLACE PROCEDURE dates("begin_date" string, "end_date" string)
RETURNS string
LANGUAGE javascript
AS
$$
function printed_date(d) {
return d.toISOString().split("T")[0]
}
function execute_query(d) {
var stmt = snowflake.createStatement({
sqlText: "select '" + d + "' x"
// "copy into table from s3://test/" + d
});
var rs = stmt.execute();
rs.next();
return rs.getColumnValue(1);
}
var running_date = new Date(begin_date)
var last_day = new Date(end_date)
var total_days = (last_day - running_date) / (1000 * 60 * 60 * 24);
cs = []
for(var iter=0; iter<=total_days; iter++ ) {
cs.push(execute_query(printed_date(running_date)));
running_date.setDate(running_date.getDate() + 1)
}
return cs
$$;
call dates('2020-10-01', '2020-10-04');
-- 2020-10-01,2020-10-02,2020-10-03,2020-10-04https://stackoverflow.com/questions/65881058
复制相似问题