2009-10-16 4 views
0

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

Благодаря

ответ

4

Если курсоры являются глобальными (я думаю, вы использовали местные курсоры, где это не является проблемой, потому что они закрыты, когда они выходят из области видимости), вы должны явно закрыть их.

Есть несколько проблем, о закрытии не глобальные курсоров

  • Памяти, используемый для курсора не освобождаться
  • Существуют максимальное количество курсоров вы можете открыли. В конце концов вы не сможете создать другой, потому что у вас будет открыто максимальное число курсоров.

Если вы спрашиваете, почему я должен использовать курсоры? - Иногда вам нужно перебирать строки (например, использовать регулярный цикл). Вы не можете сделать это в установленном ориентированном подходе - вам нужно использовать курсоры.

0

Это довольно хорошая практика, так как вы можете легко получить статус SQL любого конкретного запроса (ROWCOUNT, NOTFOUND и т. Д.), Независимо от того, выполняете ли вы другие запросы за это время. Кроме того, вы можете повторно использовать свои курсоры в пакете, создавать типы данных своих ROWTYPE, создавать петли над ними и всевозможные полезные вещи!

6

Вам нужно только открыть и закрыть курсоры. Implicit cursors имеют то преимущество, что Oracle автоматически управляется. Пример неявных курсоров:

DECLARE 
    l_dept dept%rowtype; 
BEGIN 
    -- implicit SELECT INTO 
    SELECT * INTO l_dept FROM dept WHERE deptno = :deptno; 
    -- implicit LOOP 
    FOR cc IN (SELECT emp.* FROM emp WHERE deptno = l_dept.deptno) LOOP 
     dbms_output.put_line('emp='||cc.empno); 
    END LOOP; 
END; 
/

Неявные курсоры более краткими в коде, вам не придется беспокоиться о закрытии их. Я также нахожу более ясным, чтобы иметь код курсора, где он фактически используется. Я редко использую явный курсор и только если их можно повторно использовать во многих местах в пакете (тогда почему бы не поместить его в один процесс?).

+0

SELECT * INTO l_dept FROM dept WHERE deptno =: deptno; –

+0

@Robert: thanks =) –

+0

+1, ваши замечания по неявным курсорам находятся на месте. Будучи ленивым, я ненавижу дополнительное кодирование, требуемое с явными курсорами. Другое преимущество: вам не нужно проверять условия отсутствия данных. Когда все данные обрабатываются, цикл выходит. – DCookie