雪花云数据平台将存储过程的结果分配给变量



我创建了一个存储过程,该过程返回创建表sql语句;我希望现在能够调用该过程,并将结果分配给一个变量,如:

set create_table_statement = call sp_create_stage_table(target_db, table_name);

雪花不会让我这么做的,所以有办法我可以。

上下文

我们刚刚移交了我们的新MDP,它是建立在AWS-S3,DBT&Snowflake,下周我们将投入生产,但我们有200多张桌子和雪管需要编码。我想通过基于表元数据生成createtable语句,然后调用该语句的结果来创建表,从而实现半自动化。目前,我们必须运行SQL,复制并粘贴结果,然后运行它,这在开发/预生产模式下是很好的,因为它只有几个表。但只有我们两个人,要创建所有这些表和管道将是一项艰巨的工作。

所以我找到了一个解决方案,创建第二个过程,并将第一个过程作为se=ql字符串调用,以获得字符串形式的结果,然后将该字符串作为sql语句调用。类似:

create or replace procedure sp_create_stage_table("db_name" string, "table_name" string)
returns string
language javascript
as
$$
var sql_string = "call sp_get_create_table_statement('" + db_name + "','" + table_name + "');";
var get_sql_query = snowflake.createStatement({sqlText: sql_string});
var get_result_set = get_sql_query.execute();
get_result_set.next();

var get_query_value = get_result_set.getColumnValue(1);

sql_string = get_query_value.toString();

try {
var main_sql_query = snowflake.createStatement({sqlText: sql_string});
main_sql_query.execute();
return "Stage Table " + table_name + " Successfully created in " + db_name + " database."
}

catch (err){
return "an error occured! n error_code: " + err.code + "n error_state: " + err.state + "n error_message: " + err.message;
}

$$;

可以将存储过程的标量结果分配给会话变量。相反:

SET var = CALL sp();

模式是:

SET var = (SELECT * FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())));

样品:

CREATE OR REPLACE PROCEDURE TEST()
RETURNS VARCHAR
LANGUAGE SQL
AS
BEGIN
RETURN 'Result from stored procedrue';
END;

CALL TEST();
SET variable = (SELECT * FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())));
SELECT $variable;
-- Result from stored procedrue

最新更新