Tipos de cursores
Você pode declarar row-positioned ou rowset-positioned cursors de várias maneiras.
Esses cursores podem ser roláveis (scrollable) ou não roláveis (not scrollable), mantidos (held) ou não retidos (not held), ou retornáveis (returnable) ou
não retornáveis (not returnable).
Além disso, você pode declarar um cursor retornável em um procedimento armazenado, incluindo a cláusula WITH RETURN; o cursor pode retornar conjuntos de
resultados para um chamador do procedimento armazenado (stored procedure).
Scrollable e non-scrollable cursors:
Quando você declara um cursor, você diz ao DB2® se deseja que o cursor seja rolável ou não rolável, incluindo ou omitido a cláusula SCROLL.
Esta cláusula determina se o cursor se move seqüencialmente para a frente na tabela de resultados ou pode mover-se aleatoriamente através da tabela de resultados.
Usando um non-scrollable cursor:
O tipo mais simples de cursor é um cursor non-scrollable.
Um cursor non-scrollable pode ser row-positioned or rowset-positioned.
Um cursor row-positioned non-scrollable move-se para a frente através da tabela de resultados uma linha por vez.
Do mesmo modo, um cursor rowset-positioned non-scrollable move-se para a frente através da tabela de resultados de um conjunto de linhas de cada vez.
Um cursor non-scrollable sempre se move seqüencialmente para a frente na tabela de resultados.
Quando o aplicativo abre o cursor, o cursor é posicionado antes da primeira linha (ou first rowset) na tabela de resultados.
Quando o aplicativo executa o primeiro FETCH, o cursor está posicionado na primeira linha (ou first rowset).
Quando o aplicativo executa instruções subsequentes FETCH, o cursor move uma linha à frente (ou one rowset ahead) para cada FETCH.
Após cada declaração FETCH, o cursor está posicionado na linha (ou rowset) que foi obtida.
Depois que o aplicativo executa uma UPDATE posicionada ou uma instrução DELETE posicionada, o cursor permanece na linha atual (ou conjunto de linhas) da
tabela de resultados.
Não é possível recuperar linhas (ou conjuntos de linhas) para trás ou mover para uma posição específica em uma tabela de resultados com um cursor não rolável.
Usando um scrollable cursor (cursor rolável):
Para fazer um cursor rolável (cursor scrollable), você declara o mesmo como rolável (scrollable).
Um cursor rolável pode ser posicionado na row-positioned ou rowset-positioned.
Para usar um cursor rolável, você executa instruções FETCH que indicam onde você deseja posicionar o cursor.
Se você deseja ordenar as linhas do conjunto de resultados do cursor e você também quer que o cursor seja atualizável, você deve declarar o cursor como rolável,
mesmo se você o utilizar apenas para recuperar linhas (ou conjuntos de linhas) sequencialmente.
Você pode usar a cláusula ORDER BY na declaração de um cursor atualizável somente se você declarar o cursor como rolável.
Declarando a scrollable cursor:
Para indicar que um cursor é rolável, você declara com a palavra-chave SCROLL.
Os seguintes exemplos mostram uma característica dos cursores roláveis: a sensitivity (sensibilidade).
A figura a seguir mostra uma declaração para um cursor insensitive scrollable.
EXEC SQL DECLARE C1 INSENSITIVE SCROLL CURSOR FOR
SELECT DEPTNO, DEPTNAME, MGRNO
FROM DSN8A10.DEPT
ORDER BY DEPTNO
END-EXEC.
|
Declarar um cursor rolável (scrollable cursor) com a palavra-chave INSENSITIVE tem os seguintes efeitos:
A figura a seguir mostra uma declaração para um cursor rolável estático sensível (sensitive static scrollable cursor).
EXEC SQL DECLARE C2 SENSITIVE STATIC SCROLL CURSOR FOR
SELECT DEPTNO, DEPTNAME, MGRNO
FROM DSN8A10.DEPT
ORDER BY DEPTNO
END-EXEC.
|
Declarando um cursor como SENSITIVE STATIC tem os seguintes efeitos::
- O tamanho da tabela de resultados não cresce após o aplicativo abrir o cursor.
As linhas que estão inseridas na tabela subjacente não são adicionadas à tabela de resultados..
- A ordem das linhas não muda após o aplicativo abrir o cursor.
Se a declaração do cursor contiver uma cláusula ORDER BY e as colunas que estão na cláusula ORDER BY forem atualizadas após o cursor ser aberto,
a ordem das linhas na tabela de resultados não é alterada.
- Quando o aplicativo executa instruções UPDATE e DELETE postas com o cursor, essas alterações são visíveis na tabela de resultados.
- Quando o valor atual de uma linha não satisfaz mais a instrução SELECT que foi usada na declaração do cursor, essa linha não está mais visível na tabela
de resultados.
- Quando uma linha da tabela de resultados é excluída da tabela subjacente, essa linha não está mais visível na tabela de resultados.
- As alterações feitas na tabela subjacente por outros cursores ou outros processos de aplicação podem ser visíveis na tabela de resultados, dependendo
se as instruções FETCH que você usa com o cursor são instruções FETCH INSENSITIVE ou FETCH SENSITIVE.
A figura a seguir mostra uma declaração para um cursor dinâmico sensível (sensitive dynamic scrollable).
EXEC SQL DECLARE C2 SENSITIVE DYNAMIC SCROLL CURSOR FOR
SELECT DEPTNO, DEPTNAME, MGRNO
FROM DSN8A10.DEPT
ORDER BY DEPTNO
END-EXEC.
|
Declarando um cursor como SENSITIVE DYNAMIC tem os seguintes efeitos::
- O tamanho e o conteúdo da tabela de resultados podem mudar com cada busca (FETCH).
A tabela base pode mudar enquanto o cursor está rolando (scrolling) sobre a mesma.
Se o processo de aplicação do cursor alterar os dados, o cursor vê os dados recém-modificados imediatamente.
- A ordem das linhas pode mudar depois que o aplicativo abre o cursor..
Se a instrução SELECT da declaração do cursor contiver uma cláusula ORDER BY e as colunas que estão na cláusula ORDER BY forem atualizadas após o cursor
ser aberto, a ordem das linhas na tabela de resultados será alterada.
- Quando o aplicativo executa as instruções UPDATE e DELETE postas com o cursor, essas alterações são visíveis.
Além disso, quando o aplicativo executa as operações de INSERT, UPDATE ou DELETE (dentro do aplicativo, mas fora do cursor), essas alterações são visíveis.
- Todas as inserções, atualizações e exclusões confirmadas por outros processos de aplicativos são visíveis.
- Como a instrução FETCH é executada contra a tabela base, o cursor não precisa de tabela de resultados temporários.
Quando você define um cursor como SENSITIVE DYNAMIC, você não pode especificar a palavra-chave INSENSITIVE em uma instrução FETCH para esse cursor.
Visibilidade de alterações em uma tabela de resultados:
- Se um cursor pode ver suas próprias alterações ou as mudanças feitas nos dados por outros processos ou cursores, depende de como o cursor é declarado e
da atualização do cursor.
- A visibilidade também depende do tipo de operação de busca executada com o cursor.
- A tabela a seguir resume a visibilidade das mudanças em uma tabela de resultados para cada tipo de cursor.
| Tipo de cursor declarado |
Cursor é atualizável ou somente leitura? |
As mudanças pelo cursor estão visíveis na tabela de resultados?3 |
Alterações por outros cursores ou processos estão visíveis para a tabela de resultados? |
| NO SCROLL (result table is materialized) |
Somente leitura1 |
Não aplicável |
Não |
| NO SCROLL (result table is not materialized) |
Atualizável2 |
Sim |
Sim |
| INSENSITIVE SCROLL |
Somente leitura4 |
Não aplicável |
Não |
| SENSITIVE STATIC SCROLL |
Atualizável2,6 |
Sim |
Depende da sensibilidade expressa ou implicitamente especificada na cláusula FETCH5 |
| SENSITIVE DYNAMIC SCROLL |
Atualizável2 |
Sim |
Sim7 |
Notas:
- O conteúdo da instrução SELECT do cursor torna o cursor implicitamente somente leitura.
- O cursor é atualizável somente se FOR READ ONLY ou FOR FETCH ONLY não for especificado como parte da instrução SELECT do cursor, e não há nada no conteúdo
da instrução SELECT faz com que o cursor seja implicitamente somente leitura.
- Se INSENSITIVE for especificado no FETCH, somente as alterações feitas pelo mesmo cursor são visíveis, assumindo que as linhas que estão sendo buscadas
ainda não foram lidas por um SENSITIVE FETCH no mesmo cursor.
- Um cursor INSENSITIVE é somente leitura se uma cláusula de atualização não for especificada.
- A cláusula de sensibilidade em uma declaração FETCH afeta a visibilidade das mudanças dos outros da seguinte maneira:
- Para FETCH INSENSITIVE: Somente as atualizações e exclusões postas feitas pelo mesmo cursor são visíveis.
- Para FETCH SENSITIVE: todas as atualizações e exclusões são visíveis.
- As atualizações e exclusões posicionadas não são permitidas se os valores das colunas selecionadas não coincidem com os valores atuais das colunas na
tabela base, mesmo que a linha satisfaça o predicado da instrução SELECT do cursor.
- Todas as atualizações e exclusões que são feitas por esse cursor, e mudanças comprometidas que são feitas por outros processos são visíveis em declarações
FETCH subseqüentes.<>br
As inserções que são feitas por este processo também são visíveis à medida que a tabela de resultados é rolada.
As inserções de outros processos nas tabelas de base subjacentes à tabela de resultados estão visíveis após serem comitadas (commit).
|
Conceitos relacionados: