雪花将参数传递给多个存储过程

jun*_*tsu 3 snowflake-cloud-data-platform

我创建了单独的进程,当手动运行时使用 2 个日期参数运行。但我正在尝试编写一个按顺序调用这些过程的包装过程。到目前为止我所做的示例代码如下。

CREATE OR REPLACE PROCEDURE SANDBOX.MERC.SP_LOAD_INCR_MERGE_DT("STARTDATE" DATE, "ENDDATE" DATE)
RETURNS VARCHAR(1000000)
LANGUAGE JAVASCRIPT
EXECUTE AS OWNER
AS '

var stmt = snowflake.createStatement({sqlText: `call SANDBOX.MERC.SP_LOAD_HDR_INCR_MERGE_DT(?, ?)`,binds: [STARTDATE, ENDDATE]});
var result = stmt.execute();


var stmt = snowflake.createStatement({sqlText: `call SANDBOX.MERC.SP_LOAD_LINEDETAIL_INCR_MERGE_DT(?, ?)`,binds: [STARTDATE, ENDDATE]});
var result = stmt.execute();


var stmt = snowflake.createStatement({sqlText: `call SANDBOX.MERC.header_daily(?, ?)`,binds: [STARTDATE, ENDDATE]});
var result = stmt.execute();

var stmt = snowflake.createStatement({sqlText: `call SANDBOX.MERC.lineitem_daily(?, ?)`,binds: [STARTDATE, ENDDATE]});
var result = stmt.execute();

return sql_command;';
Run Code Online (Sandbox Code Playgroud)

任何建议都会非常好。我已经看过这些网址 https://community.snowflake.com/s/question/0D50Z00009E2qFHSAZ/how-do-i-bind-a-date-within-a-stored-procedure

通过以下方式单独调用这些过程

call SANDBOX.MERC.SP_LOAD_HDR_INCR_MERGE_DT ('2021-01-12','2021-01-14' )
Run Code Online (Sandbox Code Playgroud)

按预期工作。感谢您提前提供的任何帮助。

Ric*_*ane 5

您遇到的问题是将日期转换为字符串,并且要以 Snowflake 喜欢的方式执行此操作,您可以在变量上使用 .toISOString() 函数。

下面是完整的工作示例。

create table stacko_69408091 (
    dt1     DATE,
    dt2     DATE);


CREATE OR REPLACE PROCEDURE sp_insert(p1 date, p2 date)
RETURNS ARRAY
LANGUAGE javascript
EXECUTE AS caller
AS 
$$
try {
    var whereAmI = 1;
    var return_array = [];
    var counter = 0;

    var p1_str = "p1: " + P1.toString();
    var p2_str = "p2: " + P2.toString();
    return_array.push(p1_str)
    return_array.push(p2_str)

    var whereAmI = 2;
    var sqlquery = `
        INSERT INTO stacko_69408091 VALUES (?, ?)
    `;

    snowflake.execute({"sqlText" : sqlquery, "binds" : [P1.toISOString(), P2.toISOString()]});

    var whereAmI = 3;
    var query_id_list = snowflake.execute({sqlText: `SELECT LAST_QUERY_ID()::varchar;`});
    if (query_id_list.next()){
      var query_id = query_id_list.getColumnValue(1);
      return_array.push(query_id);
    }
  
    var whereAmI = 4;
    return_array.push("end process");

    return return_array;
    }

catch (err) {
   return_array.push("error found");
   return_array.push("whereAmI: " + whereAmI);
   return_array.push("err.code: " + err.code);
   return_array.push("err.state: " + err.state);
   return_array.push("err.message: " + err.message);
   return_array.push("err.stacktracetxt: " + err.stacktracetxt);
   return return_array;
}

$$;

CALL sp_insert('2021-09-01'::date, '2021-10-01'::date);
select * from stacko_69408091;




CREATE OR REPLACE PROCEDURE sp_main(STARTDATE DATE, ENDDATE DATE)
RETURNS VARCHAR(1000000)
LANGUAGE JAVASCRIPT
EXECUTE AS OWNER
AS
$$

var stmt = snowflake.createStatement({sqlText: `call sp_insert(?, ?)`,binds: [STARTDATE.toISOString(), ENDDATE.toISOString()]});
var result = stmt.execute();


var stmt = snowflake.createStatement({sqlText: `call sp_insert(?, ?)`,binds: [STARTDATE.toISOString(), ENDDATE.toISOString()]});
var result = stmt.execute();


return "done";

$$
;


CALL sp_main('2021-09-01'::date, '2021-10-01'::date);
select * from stacko_69408091;
Run Code Online (Sandbox Code Playgroud)