2015-04-30 5 views
0

Я делаю выбор в хранимой процедуре с помощью курсора, я хотел бы знать, если бы я мог сделать тот же выбор, не используя курсор.Hana - Выбрать без курсора

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; 

ответ

1

Технически вы можете преобразовать результирующий набор в ARRAY, а затем цикл по массиву - но для чего?

Основная проблема заключается в том, что вы хотите автоматически предоставлять разрешения для любых пользователей, которые соответствуют вашему времени, основанному на условии WHERE. Это не очень хорошая идея в большинстве сценариев.

Точка зрения курсоров заключается в том, чтобы позволить СУБД оптимизировать команды SQL. Рассказывая СУБД, какие данные вы хотите, а не как ее создать.

В этом примере это действительно не повлияло бы на производительность.

Гораздо более важным фактором является то, что вы запускаете SELECT *, хотя вам нужно только USER_NAME и что ваша переменная R объявлена ​​как VARCHAR (50) (что неверно, если вы хотите сохранить в ней USER_NAME), но никогда фактически использован. Переменная R в цикле FOR существует в другом контексте действительности и фактически содержит текущую строку курсора.