【问题标题】:Pass value within snowflake's javascript procedure在雪花的 javascript 过程中传递值
【发布时间】:2020-03-17 14:18:22
【问题描述】:

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

我正在尝试 %ROWCOUNT, CURSOR 大小写,但遇到以下问题:

创建或替换过程 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);
  }
$$

【问题讨论】:

    标签: javascript sql procedure snowflake-cloud-data-platform


    【解决方案1】:

    当然。

    你可以这样做:

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

    我列出了从结果集中提取数据的各种方法:
    How to use Show Command in Stored Procedures - Not working

    [从上面复制]:

    如果你有多个列,代码会稍微复杂一些:

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

    【讨论】:

    • 为了提供更多细节,我希望像在 PL/SQL、T-SQL 中那样重新创建 ROWCOUNT 循环
    • 我在上面提供了更多示例。 Snowflake中没有相当于cursor%ROWCOUNT的,但是执行查询后,stmt.rowCount(未记录)包含了结果集中的行数。
    • 我不完全了解如何对将第一个查询结果传递到另一个查询的时刻进行编码。你能详细说明一下吗?
    • 我在答案顶部的第一个版本中扩展了省略号 [...]。您在第二个查询中使用位置参数(在本例中为:1),它是 binds[] 值数组的索引(索引从 1 开始)
    • 有很多方法可以做到这一点,但也许最简单的方法是将两个查询合并为一个。为什么必须是两个查询?我认为您可能正在尝试模拟 Oracle 等其他系统的代码,但无法猜测该代码可能是什么。
    猜你喜欢
    • 2021-06-19
    • 2021-12-08
    • 1970-01-01
    • 2022-10-15
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2021-11-11
    相关资源
    最近更新 更多