Snowflake Javascript SP 输出为表?

Sou*_*abh 4 snowflake-cloud-data-platform

我正在编写一个 SP,其中的输出预计为表格。但无法以表格式获取输出,而是将其作为对象接收单个值或一列中的所有行,同时使用数组作为返回类型。

create or replace table monthly_sales(empid int, amount int, month text)
as select * from values
(1, 10000, 'JAN'),
(1, 400, 'JAN'),
(2, 4500, 'JAN'),
(2, 35000, 'JAN'),
(1, 5000, 'FEB'),
(1, 3000, 'FEB'),
(2, 200, 'FEB'),
(2, 90500, 'FEB'),
(1, 6000, 'MAR'),
(1, 5000, 'MAR'),
(2, 2500, 'MAR'),
(2, 9500, 'MAR'),
(1, 8000, 'APR'),
(1, 10000, 'APR'),
(2, 800, 'APR'),
(2, 4500, 'APR'),
(2, 10000, 'MAY'),
(1, 800, 'MAY');
---------------------------------------------------------- 
select * from MONTHLY_SALES;
------------------------------------------------------------

create or replace procedure getRowCount(TABLENAME VARCHAR(1000))
returns variant
not null
language javascript
as
$$
// Dynamically compose the SQL statement to execute.

var sql_command = " SELECT * FROM "+TABLENAME+";"

// Prepare statement.
var stmt = snowflake.createStatement({sqlText: sql_command});

// Execute Statement
try
{
var rs = stmt.execute();

return rs;

}catch(err){return "error "+err;}
$$;

Call getRowCount('MONTHLY_SALES');
Run Code Online (Sandbox Code Playgroud)

预期输出: 在此输入图像描述

Gre*_*lik 5

Snowflake存储过程不能有表的输出类型。(更新:自从最初写这篇文章以来,Snowflake 引入了 SQL 脚本。它是唯一支持直接返回表的存储过程。)您有几个选择。一种选择是编写一个返回数组或 JSON 的存储过程,您可以将其平铺到表中。但请注意,您不能直接使用存储过程的返回值。您必须首先运行存储过程,并且在会话中执行的下一条语句收集如下输出:

select * from  table(result_scan(last_query_id()));
Run Code Online (Sandbox Code Playgroud)

另一种选择是编写用户定义的表函数 (UDTF),它是 Snowflake 中唯一返回表的函数类型。下面是一个简单的 UDTF 示例:

create or replace function COUNT_LOW_HIGH(LowerBound double, UpperBound double)
    returns table (MY_NUMBER double)
    LANGUAGE JAVASCRIPT
    AS
$$
{
    processRow: function get_params(row, rowWriter, context){
        for (var i = row.LOWERBOUND; i <= row.UPPERBOUND; i++) {
            rowWriter.writeRow({MY_NUMBER: i});
        }
   }
}
$$;
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用 TABLE 函数调用 UDTF,如下所示:

SELECT * FROM TABLE(COUNT_LOW_HIGH(1::double, 1000::double));
Run Code Online (Sandbox Code Playgroud)