本文介绍了如何在存储过程中使用显示命令-不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
跟随博客帖子https://community.snowflake.com/s/article/How-to-USE-SHOW-COMMANDS-in-Stored-Procedures
我得到的结果是NaN,这是有意义的,因为在这篇博客文章中返回值设置为Float。
我已尝试将返回值设置为varchar、String等,但得到了不同的结果,如Object Object等。
CREATE或REPLACE PROCEDURE SHOP(CMD VARCHAR)返回FLOAT NOT NULL语言JavaScript以调用者身份执行作为$$var stmt=雪花.createStatement({sqlText:${CMD}
});var res=stmt.ecute();退货价格$$;预期返回表列表,实际结果为NaN。
推荐答案
stmt.execute()
调用返回一个ResultSet
对象,该对象在转换为FLOAT
时将变为NaN
。您需要使用ResultSet
对象提取查询返回的数据。
还要记住,JavaScript中的变量引用是简单的,即。CMD
。
如果您想要"预期的返回是一个表列表",那么PROCEDURE
返回类型FLOAT
将不起作用,不管它是什么。我怀疑您想要ARRAY
或完全灵活的VARIANT
。两者都适用于以下各项:
$$
var stmt = snowflake.createStatement( { sqlText: CMD } );
var rs = stmt.execute();
var result = [];
while (rs.next())
result.push(rs.getColumnValue(1));
return result;
$$;
有关详细信息,请参阅Stored Procedures API文档。
如果您有多列,代码会变得稍微复杂一些:
var result = [], row, col;
while (rs.next()) {
row = [];
for (col = 1; col <= stmt.columnCount; col++)
row.push(rs.getColumnValue(col));
result.push(row);
}
核心JavaScript程序员可能会将其压缩为:
var result = [], cols = Array.from({ length: stmt.columnCount }, (v, i) => i + 1);
while (rs.next()) result.push(cols.map(c => rs.getColumnValue(c)));
最终变体,其中第一个结果行包含列名,后续行包含结果集中的数据,可作为结果[行][列]进行访问:
var result =
[ Array.from({ length: stmt.columnCount }, (v, i) => stmt.getColumnName(i + 1)) ];
while (rs.next()) result.push(result[0].map(cn => rs.getColumnValue(cn)));
这篇关于如何在存储过程中使用显示命令-不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!