0

我正在使用游标在存储过程中进行选择,我想知道是否可以在不使用游标的情况下进行相同的选择。

PROCEDURE "DOUGLAS"."tmp.douglas.yahoo::testando" ( ) 
  LANGUAGE SQLSCRIPT
  SQL SECURITY INVOKER 
  DEFAULT SCHEMA DOUGLAS
  AS
BEGIN
/***************************** 
  procedure logic 
 *****************************/

declare R varchar(50);

declare cursor users FOR select * from USERS WHERE CREATE_TIME between ADD_SECONDS (CURRENT_TIMESTAMP , -7200 ) and CURRENT_TIMESTAMP;

FOR R AS users DO
  CALL _SYS_REPO.GRANT_ACTIVATED_ROLE('dux.health.model.roles::finalUser',R.USER_NAME);

  END FOR;

END;
4

1 回答 1

1

从技术上讲,您可以将结果集转换为 ARRAY,然后在数组上循环——但是为了什么?

主要问题是您希望自动授予与基于时间的 WHERE 条件匹配的任何用户的权限。在大多数情况下,这不是一个好主意。

避免游标的目的是让 DBMS 优化 SQL 命令。告诉 DBMS 你想要什么数据,而不是如何产生它。

在这个例子中,它真的不会对性能产生任何影响。

一个更重要的因素是您运行 SELECT * 即使您只需要 USER_NAME 并且您的 R 变量被声明为 VARCHAR(50) (如果您想将 USER_NAME 存储在其中,这是错误的)但从未实际使用过。FOR 循环中的 R 变量存在于不同的有效性上下文中,实际上包含游标的当前行。

于 2015-05-04T20:34:07.880 回答