雪花Javascript SP输出为表格吗?

时间:2020-04-21 13:41:39

标签: 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');

从MONTHLY_SALES中选择*;

创建或替换过程getRowCount(TABLENAME VARCHAR(1000)) 返回变体 不为空 语言javascript 如 $$ //动态组成要执行的SQL语句。

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

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

//执行语句 尝试 { var rs = stmt.execute();

return rs;

} catch(err){返回“错误” + err;} $$;

致电getRowCount('MONTHLY_SALES');

'''

预期输出: enter image description here

1 个答案:

答案 0 :(得分:1)

雪花存储过程不能具有表的输出类型。您有几种选择。一种选择是编写存储过程,该存储过程返回可以展平为表的数组或JSON。但是请注意,您不能直接使用存储过程的返回。您必须首先运行存储过程,然后在会话中执行的下一条语句收集如下输出:

select * from  table(result_scan(last_query_id()));

另一种选择是编写用户定义的表函数(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});
        }
   }
}
$$;

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

SELECT * FROM TABLE(COUNT_LOW_HIGH(1::double, 1000::double));