如何在雪花中的另一个过程中调用过程

时间:2020-09-27 17:52:00

标签: javascript sql stored-procedures snowflake-cloud-data-platform

这是我的存储过程,用于检索表的所有列名。我想在另一个过程中调用该过程。

CREATE OR REPLACE PROCEDURE get_columns(TABLE_NAME VARCHAR)
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
var stmt = snowflake.createStatement({
    sqlText: "SELECT * FROM " + TABLE_NAME + " LIMIT 1;",    
});
stmt.execute();

var cols=[];
for (i = 1; i <= stmt.getColumnCount(); i++) {
  cols.push(stmt.getColumnName(i));
}
return cols
$$;

下面是调用上述过程并返回一个列名数组的主过程。但是我不明白我要去哪里错了。

CREATE OR REPLACE PROCEDURE get_data()   //procedure call the above procedure
    RETURNS ARRAY
    LANGUAGE JAVASCRIPT
    AS
    $$
    var arr = [];
    var r = snowflake.createStatement({sqlText: "call get_columns('Table_Name')"});
    arr = r.execute();  //r.execute() returns an array
    return arr; //getting an error
    $$

2 个答案:

答案 0 :(得分:1)

我没有看到任何“大”错误……也许在调用get_columns('Table_Name')帮助后添加分号? (对我来说,这里也可以不用分号,因此我认为这不是问题)

最重要的是,最后$后面没有分号(也许脚本中稍后的代码会导致错误)

其他信息可以在这里https://docs.snowflake.com/en/sql-reference/stored-procedures-overview.html#stored-procedures-are-called-as-independent-statements

最后一个提示可能是对表的访问权限。

答案 1 :(得分:1)

您遇到的问题是您没有对结果集 arr 进行迭代。您可以在代码中执行以下操作:

CREATE OR REPLACE PROCEDURE get_data()   //procedure call the above procedure
  RETURNS ARRAY
  LANGUAGE JAVASCRIPT
  AS
  $$
  var arr = [];
  var r = snowflake.createStatement({sqlText: "call get_columns('TABLE_NAME')"});
  arr = r.execute();
  arr.next();
  return arr.getColumnValue(1);
  $$;
    
call get_data();