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

Posted

技术标签:

【中文标题】如何在雪花中调用另一个过程中的过程【英文标题】:How to call a procedure inside another procedure in snowflake 【发布时间】:2020-09-27 17:52:00 【问题描述】:

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

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
    $$

【问题讨论】:

你的错误信息/输出是什么?那么到底出了什么问题呢? @Marcel 我收到“返回值不是数组” @Marcel 这将返回一个 [object Object] 很好奇为什么您使用 SP 来返回 ARRAY,而不是使用 UDTF 并返回表。可能更适合您... @Marcel,没关系,我想通了。谢谢。 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

您遇到的问题是您没有对结果集 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();

【讨论】:

以上是关于如何在雪花中调用另一个过程中的过程的主要内容,如果未能解决你的问题,请参考以下文章

雪花:从另一个过程调用的带有 ARRAY 参数的过程

如何获取雪花中执行存储过程的名称?

避免雪花中存储过程的重复

如何评估雪花存储过程中的语句

如何在另一个存储过程中调用一个存储过程(PHP 和 mysqli)

可以从雪花中的函数调用存储过程吗