Snowflake cloud data platform 有没有一种简单的方法可以从Snowflake存储过程中检索标量结果

Snowflake cloud data platform 有没有一种简单的方法可以从Snowflake存储过程中检索标量结果,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,有没有一种简单的方法可以从另一个存储过程中的雪花存储过程中检索标量结果 我想使用一个存储过程生成一个复杂的SQL语句,并将该SQL语句激发到另一个过程中 CREATE OR REPLACE PROCEDURE GENERATE_SQL( ) RETURNS VARCHAR LANGUAGE JAVASCRIPT AS $$ return "SELECT 'Hello world'"; $$ ; 在单独的过程中生成SQL将允许我更容易地维护/单元测试该位。而不是直接进行 您可以在另一个存储过程

有没有一种简单的方法可以从另一个存储过程中的雪花存储过程中检索标量结果

我想使用一个存储过程生成一个复杂的SQL语句,并将该SQL语句激发到另一个过程中

CREATE OR REPLACE PROCEDURE GENERATE_SQL( )
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS 
$$
return "SELECT 'Hello world'";
$$
;
在单独的过程中生成SQL将允许我更容易地维护/单元测试该位。

而不是直接进行

您可以在另一个存储过程中调用该存储过程;外部存储过程中的JavaScript可以检索和存储内部存储过程的输出。但是,请记住,外部存储过程(以及每个内部存储过程)仍然无法向其调用者返回多个值

您可以调用存储过程,然后调用RESULT_SCAN函数,并将为存储过程生成的语句ID传递给它

CREATE OR REPLACE PROCEDURE GENERATE_SQL( )
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS 
$$
return "SELECT 'Hello world'";
$$
;
可以将结果集存储在临时表或永久表中,并在从存储过程调用返回后使用该表

如果数据量不太大,可以将多行和多列存储在一个变量中(例如,作为JSON值),然后返回该变量。

不直接返回

您可以在另一个存储过程中调用该存储过程;外部存储过程中的JavaScript可以检索和存储内部存储过程的输出。但是,请记住,外部存储过程(以及每个内部存储过程)仍然无法向其调用者返回多个值

您可以调用存储过程,然后调用RESULT_SCAN函数,并将为存储过程生成的语句ID传递给它

CREATE OR REPLACE PROCEDURE GENERATE_SQL( )
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS 
$$
return "SELECT 'Hello world'";
$$
;
可以将结果集存储在临时表或永久表中,并在从存储过程调用返回后使用该表


如果数据量不太大,您可以将多行和多列存储在一个变量中(例如,作为JSON值),然后返回该变量。

我想添加到MMV的答案中。您可以读取第一个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();

我想补充一下MMV的答案。您可以读取第一个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();

来自SQL Server的背景,我应该自己考虑一下。。。将结果存储在临时表中将是完美的!很多感谢来自SQL Server的背景,我应该自己考虑一下。。。将结果存储在临时表中将是完美的!非常感谢