如何在存储过程中使用显示命令-不起作用 [英] How to use Show Command in Stored Procedures - Not working

查看:21
本文介绍了如何在存储过程中使用显示命令-不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

跟随博客帖子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)));

这篇关于如何在存储过程中使用显示命令-不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆