2014-10-24 2 views
3

Я кодирую как SQL Server, так и Oracle.
Когда я кодирования в SQL Server, я использовал:Как освободить курсор в PLSQL?

OPEN curUSERS; 
CLOSE curUSERS; 
DEALLOCATE curUSERS; 

Теперь, когда я кодирования в Oracle, я использовал это:

OPEN curUSERS; 
CLOSE curUSERS; 

Я видел DEALLOCATE ключевое слово в PL/SQL, но когда я использовал это заявление

DEALLOCATE(curUSERS); 

Он выдает сообщение об ошибке. Как я могу сделать то же самое (освобождение) в PL/SQL?

+1

Если это ключевое слово, я ожидаю, что вызов будет похож на OPEN и CLOSE, например. 'DEALLOCATE curUSERS' без круглых скобок. Но я никогда не видел и не использовал это. Не могли бы вы отредактировать вопрос и предоставить ссылку на документы Oracle для этого? Благодарю. –

+0

У вас есть галлюцинации! Oracle PL/SQL не имеет ключевого слова 'deallocate': [Oracle 11.2 Зарезервированные слова и ключевые слова PL/SQL] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/reservewords.htm). Я не знаю SQL Server, но в Oracle закрытие/освобождение/очистка курсора - это одноэтапная операция: 'close'. – user272735

ответ

4

Oracle не требует явно освобождать память курсора. Просто CLOSE(cursor) в порядке.

+0

Это сложно ввести в заблуждение. Память, используемая явно открытым курсором, не выводится до тех пор, пока курсор не будет явно очищен (или сеанс закрыт). В терминологии Oracle фаза очистки _closing_. – user272735

0

Следует избегать явных указателей, когда это возможно. Явные курсоры требуют большего количества кода и медленнее, потому что они не собираются автоматически. Циклы курсора FOR просты и быстры.

Пример схемы

drop table table1; 
create table table1 as select 1 a from dual; 

Явные курсоры - больше кода, хуже производительность

declare 
    v_a number; 
    cursor table1_cursor is select a from table1; 
begin 
    open table1_cursor; 
    loop 
     fetch table1_cursor into v_a; 
     exit when table1_cursor%notfound; 
     dbms_output.put_line(v_a); 
    end loop; 
    close table1_cursor; 
end; 
/

Курсор для петли - меньше кода, более высокую производительность

begin 
    for table1_rows in (select a from table1) 
    loop 
     dbms_output.put_line(table1_rows.a);  
    end loop; 
end; 
/
+0

Цикл for все еще не так эффективен, как forall с массовым сбором. Если производительность является конечной целью, то избавиться от цикла на первом месте. –

+1

@LalitKumarB Да, никакой петли лучше, когда это возможно. Вопрос заключается только непосредственно в чтении данных, где цикл for так же эффективен, как и любой явный сбор массы. Чтение и письмо часто идут вместе, но по моему опыту, как правило, гораздо больше чтения, чем написание, и получение автоматического навального сбора при чтении достаточно хорошее. –

+1

Нам нужно написать явный курсор даже с массовым сбором; для использования предельного предложения –

Смежные вопросы