无法在雪花数据库中运行存储过程
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 implementing
javascript` 的 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');
【讨论】:
以上是关于无法在雪花数据库中运行存储过程的主要内容,如果未能解决你的问题,请参考以下文章