首页 > 解决方案 > 在雪花的 javascript 过程中传递值

问题描述

在 Snowflake dwh 中是否可以检索 SQL 查询结果并将其作为变量传递给同一过程中的下一个查询?

我正在尝试尝试 %ROWCOUNT, CURSOR case 并陷入以下困境:

创建或替换过程 PASS_VAR_IN_JS()
返回 VARCHAR
语言 javascript
  作为
    $$
    var command = "SELECT * FROM TABLE WHERE ATTRIBUTE = 'Value'";
    var stmt = snowflake.createStatement( {sqlText: command} );
    var result1 = stmt.execute();
    返回结果1.getColumnName(3); //这会返回列名
    var col_name = result1.getColumnName(3); //将列名保存到变量中

    //将列名传递给查询
    var stmt = snowflake.createStatement({sqlText: "SELECT * FROM INFORMATION_SCHEMA WHERE COLUMN_NAME = ;", binds:[col_name]});

    $$;
UPDATE - working code that passes one result to another query
<pre>
CREATE OR REPLACE PROCEDURE szpotma_rowcount()
RETURNS VARCHAR(250)
LANGUAGE JAVASCRIPT
as
$$
  var command = `SELECT ATTR1 FROM TABLE1 LIMIT 1`; 
  var stmt = snowflake.createStatement( {sqlText: command} );
  var rs = stmt.execute(), col_name ;

  if (rs.next()) {
    col_name = rs.getColumnValue(1);
    stmt = snowflake.createStatement({
        sqlText: `SELECT STATUS FROM TABLE_STATUS WHERE ATTR1 = :1`, binds: [col_name]});

    //view second query results
    rs = stmt.execute();    
    rs.next()
    return rs.getColumnValue(1);
  }
$$

标签: javascriptsqlproceduresnowflake-cloud-data-platform

解决方案


当然。

你可以这样做:

  var command = `SELECT * FROM TABLE WHERE ATTRIBUTE = 'Value'`;
  var stmt = snowflake.createStatement( {sqlText: command} );
  var rs = stmt.execute(), col_name ;
  if (rs.next()) {
    col_name = rs.getColumnValue(3);

    stmt = snowflake.createStatement({
        sqlText: `SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = :1`, 
          binds: [col_name]
    });
  }

我列出了从结果集中提取数据的各种方法:
如何在存储过程中使用显示命令 - 不工作

[从上面复制]:

如果您有多个列,则代码会变得稍微复杂一些:

  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)));

最后一个变体,其中第一个结果行包含列名,随后的行包含结果集中的数据,可通过 result[row][column] 访问:

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)));

推荐阅读