有没有一种简单的方法可以从 Snowflake 存储过程中检索标量结果
Is there a simple way to retrieve a scalar result from a Snowflake stored procedure
是否有一种简单的方法可以从另一个存储过程中的 Snowflake 存储过程中检索标量结果?
我想使用一个存储过程生成复杂的 SQL 语句并将该 SQL 语句触发到另一个过程中。
CREATE OR REPLACE PROCEDURE GENERATE_SQL( )
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
return "SELECT 'Hello world'";
$$
;
在单独的过程中生成 SQL 将使我能够更轻松地 maintain/unit 测试该位。
不直接。
您可以在另一个存储过程中调用该存储过程;外部存储过程中的 JavaScript 可以检索和存储内部存储过程的输出。但是请记住,外部存储过程(以及每个内部存储过程)仍然无法 return 向其调用者提供多个值。
您可以调用存储过程,然后调用 RESULT_SCAN 函数并将为存储过程生成的语句 ID 传递给它。
您可以将结果集存储在临时 table 或永久 table 中,并在 return 从存储过程调用中使用 table。
如果数据量不是太大,可以将多行多列存储在一个VARIANT中(比如作为JSON值),return那个VARIANT
我想补充一下 MMV 的回答。您可以在不调用 RESULT_SCAN 的情况下读取第一个 SP 的结果。当您调用存储过程时,您会得到一个单行结果集,其中有一个列与您调用的存储过程同名。所以你可以像查询一样调用 SP 并像这样获取该列中的值:
create or replace procedure second_sp()
returns string
language javascript
as
$$
return "Hello world."
$$;
create or replace procedure first_sp()
returns string
language javascript
as
$$
// Use the name of the SP called as the column name for the return:
return ExecuteSingleValueQuery("SECOND_SP", "call second_sp()");
// Helper function to read a single-value query
function ExecuteSingleValueQuery(columnName, queryString) {
var out;
cmd1 = {sqlText: queryString};
stmt = snowflake.createStatement(cmd1);
var rs;
try{
rs = stmt.execute();
rs.next();
return rs.getColumnValue(columnName);
}
catch(err) {
if (err.message.substring(0, 18) == "ResultSet is empty"){
throw "ERROR: No rows returned in query.";
} else {
throw "ERROR: " + err.message.replace(/\n/g, " ");
}
}
return out;
}
$$;
call second_sp();
call first_sp();
是否有一种简单的方法可以从另一个存储过程中的 Snowflake 存储过程中检索标量结果?
我想使用一个存储过程生成复杂的 SQL 语句并将该 SQL 语句触发到另一个过程中。
CREATE OR REPLACE PROCEDURE GENERATE_SQL( )
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
return "SELECT 'Hello world'";
$$
;
在单独的过程中生成 SQL 将使我能够更轻松地 maintain/unit 测试该位。
不直接。
您可以在另一个存储过程中调用该存储过程;外部存储过程中的 JavaScript 可以检索和存储内部存储过程的输出。但是请记住,外部存储过程(以及每个内部存储过程)仍然无法 return 向其调用者提供多个值。
您可以调用存储过程,然后调用 RESULT_SCAN 函数并将为存储过程生成的语句 ID 传递给它。
您可以将结果集存储在临时 table 或永久 table 中,并在 return 从存储过程调用中使用 table。
如果数据量不是太大,可以将多行多列存储在一个VARIANT中(比如作为JSON值),return那个VARIANT
我想补充一下 MMV 的回答。您可以在不调用 RESULT_SCAN 的情况下读取第一个 SP 的结果。当您调用存储过程时,您会得到一个单行结果集,其中有一个列与您调用的存储过程同名。所以你可以像查询一样调用 SP 并像这样获取该列中的值:
create or replace procedure second_sp()
returns string
language javascript
as
$$
return "Hello world."
$$;
create or replace procedure first_sp()
returns string
language javascript
as
$$
// Use the name of the SP called as the column name for the return:
return ExecuteSingleValueQuery("SECOND_SP", "call second_sp()");
// Helper function to read a single-value query
function ExecuteSingleValueQuery(columnName, queryString) {
var out;
cmd1 = {sqlText: queryString};
stmt = snowflake.createStatement(cmd1);
var rs;
try{
rs = stmt.execute();
rs.next();
return rs.getColumnValue(columnName);
}
catch(err) {
if (err.message.substring(0, 18) == "ResultSet is empty"){
throw "ERROR: No rows returned in query.";
} else {
throw "ERROR: " + err.message.replace(/\n/g, " ");
}
}
return out;
}
$$;
call second_sp();
call first_sp();