无法在雪花数据库中运行存储过程

Posted

技术标签:

【中文标题】无法在雪花数据库中运行存储过程【英文标题】:Unable to run a stored procedure in snowflake database 【发布时间】:2018-11-27 14:12:53 【问题描述】:
CREATE OR REPLACE PROCEDURE wh.sp_schema.my_sp(arg1 STRING, arg2 STRING)
RETURNS VARCHAR(16777216)
LANGUAGE javascript
AS 
$$
 stmt = snowflake.createStatement(
  sqlText: `CREATE OR REPLACE TABLE wh.table_schema.RAW_`+arg2+`_`+arg1+` LIKE wh.temp_schema.RAW_`+arg2+`_TEMPLATE`
  );
rs = stmt.execute();
rs.next();
output = rs.getColumnValue(1);
return output;
$$
;

当我创建上述存储过程时 - 显示以下消息

Function my_sp successfully created.

当我使用工作表运行存储过程时

CALL my_sp('2018','abc');

我看到以下错误:

SQL compilation error: Invalid identifier my_sp

我什至尝试使用存储过程的完全限定名称运行:

CALL wh.sp_schema.my_sp('2018','abc');

我仍然看到以下错误:

SQL compilation error: Invalid identifier my_sp.

另外,我想知道一个命令来查看我的存储过程是否已创建。 我查看了雪花 UI,在“wh”仓库和“sp_schema”架构下,但除了表之外看不到任何东西(存储过程)。

【问题讨论】:

【参考方案1】:

这是一个简单的拨款问题案例。作为 SECURITYADMIN,如果您将必要的授权应用于您正在使用的角色,

GRANT USAGE ON DATABASE wh TO ROLE <role>;
GRANT USAGE ON SCHEMA wh.sp_schema TO ROLE <role>;
GRANT USAGE ON ALL PROCEDURES IN SCHEMA wh.sp_schema TO ROLE <role>;

您将克服这个模棱两可的错误并进入下一个真正的错误

JavaScript execution error: Uncaught ReferenceError: arg2 is not defined in MY_SP

这是由于javascript SP参数区分大小写,所以需要修改代码如下(将arg改为ARG):

sqlText: `CREATE OR REPLACE TABLE wh.table_schema.RAW_`+ARG2+`_`+ARG1+` LIKE wh.temp_schema.RAW_`+ARG2+`_TEMPLATE`

【讨论】:

【参考方案2】:

Snowflake 不支持基于 Stored Procedures. They are implementingjavascript` 的 API,但仍处于草稿模式。

这是他们 API 的 link(注意 Draft Document 写在右侧)。

这是link 在他们的支持论坛上的一张票,他们已经确认了。

【讨论】:

显然,这在 2019 年 5 月现在是错误的。提问者必须提前访问(并且应该注意到这一点)......【参考方案3】:

这可能会出错有两种明显的可能性:

    您已将过程所有权隐含地捐赠给您没有的ROLE 现在过程和调用类型签名之间不匹配。确认有 wh.sp_schema.my_sp(STRING, STRING) 并且您的呼叫类似于 CALL wh.sp_schema.my_sp('2018'::STRING,'abc'::STRING);

【讨论】:

【参考方案4】:

尝试按照查询语法解决错误。

CALL database_name.schema.MY_SP('database_name','schema');

【讨论】:

以上是关于无法在雪花数据库中运行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

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

雪花存储过程从 dbt 失败

雪花存储过程调用具有迭代返回消息的多个语句

雪花中的存储过程中是不是有打印命令

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

在雪花存储过程中捕获成功消息