[英]SnowFlake: Access rights in SQL vs. procedures
我在 SnowFlake 中有以下初始情况:我想在过程中检索序列的 NextVal 并在调用该过程时收到以下错误消息:
在 position 29 处的第 3 行未捕获类型为“STATEMENT_ERROR”的异常:SQL 编译错误:在 position 7 处的错误行 1 无效标识符“COMMON.SEQ_LAUF_ID”。
具有相同用户/角色的 select 工作正常:
示例 SQL:
SELECT COMMON.SEQ_LAUF_ID as nv FROM DUAL ;
示例过程:
create or replace procedure MDP_Codes ( )
returns varchar
language sql
EXECUTE AS CALLER
as
$$
DECLARE
rs resultset default ( SELECT COMMON.SEQ_LAUF_ID as nv FROM DUAL ) ;
hCur cursor for rs ;
SQL_lauf_id varchar ;
BEGIN
for hRow in hCur do
SQL_lauf_id := hRow.nv ;
end for;
return SQL_lauf_id ;
END;
$$
;
call APPSMITH.MDP_Codes();
代码SELECT COMMON.SEQ_LAUF_ID as nv FROM DUAL;
不正确,因为它缺少NEXTVAL
SELECT COMMON.SEQ_LAUF_ID as nv FROM DUAL ;
-- Invalid reference to sequence object without nextval: COMMON.SEQ_LAUF_ID.
-- should be
SELECT COMMON.SEQ_LAUF_ID.NEXTVAL as nv FROM DUAL ;
要从序列中获取下一个值,无需使用RESULTSET
和 cursor 循环,简单的赋值就足够了。
完整演示:
CREATE SCHEMA COMMON;
CREATE SEQUENCE COMMON.SEQ_LAUF_ID;
SELECT COMMON.SEQ_LAUF_ID.NEXTVAL;
-- 1
create or replace procedure MDP_Codes ( )
returns varchar
language sql
EXECUTE AS CALLER
as
$$
DECLARE
SQL_lauf_id VARCHAR;
BEGIN
SQL_lauf_id := (SELECT COMMON.SEQ_LAUF_ID.NEXTVAL);
return SQL_lauf_id ;
END;
$$
;
CALL MDP_Codes();
-- MDP_CODES
-- 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.