繁体   English   中英

SnowFlake:SQL 与程序中的访问权限

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM