DECLARE

Nome

DECLARE -- define um cursor

Sinopse

DECLARE nome [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]
    CURSOR [ { WITH | WITHOUT } HOLD ] FOR consulta
    [ FOR { READ ONLY | UPDATE [ OF coluna [, ...] ] } ]

Descrição

O comando DECLARE permite o usuário criar cursores, que podem ser utilizados para trazer, de cada vez, um pequeno número de linhas de uma consulta grande. Os cursores podem retornar dados tanto no formato texto quanto binário usando o comando FETCH .

Cursores normais retornam dados no formato texto, o mesmo produzido pelo comando SELECT. Como os dados são armazenados nativamente no formato binário, o sistema necessita realizar uma conversão para gerar o formato texto. Como a informação chega no formato texto, a aplicação cliente pode precisar convertê-la para o formato binário para manipulá-la. Além disso, dados no formato texto geralmente possuem um tamanho maior que no formato binário. Os cursores binários retornam os dados na representação binária, que pode ser manipulada mais facilmente. Entretanto, se o objetivo é exibir os dados na forma de texto, trazê-los na forma de texto reduz um pouco o esforço no lado cliente.

Como exemplo, se uma consulta retornar o valor "um" de uma coluna com tipo de dado inteiro, será recebida a cadeia de caracteres 1 com o cursor padrão, enquanto que com um cursor binário será retornado um campo de 4 bytes contendo a representação interna do valor (na ordem de byte "big-endian" [1] ).

Os cursores binários devem ser usados com cuidado. Muitas aplicações, incluindo o psql, não estão preparadas para tratar cursores binários e esperam que os dados cheguem no formato texto.

Nota: Quando a aplicação cliente utiliza o protocolo "consulta estendida" (extended query) para executar o comando FETCH, a mensagem Bind do protocolo especifica se os dados devem retornar no formato texto ou binário. Esta escolha substitui a forma como o cursor foi definido. Por isso o conceito de cursor binário fica obsoleto ao se utilizar o protocolo "consulta estendida" — todo cursor pode ser tratado tanto como texto ou binário.

Parâmetros

nome
O nome do cursor a ser criado.
BINARY
Faz o cursor retornar os dados no formato binário em vez do formato texto.
INSENSITIVE
Indica que os dados trazidos pelo cursor não devem ser afetados pelas atualizações feitas nas tabelas subjacentes ao cursor, enquanto o cursor existir. No PostgreSQL, todos os cursores são insensíveis; atualmente esta palavra chave não produz efeito, estando presente por motivo de compatibilidade com o padrão SQL.
SCROLL
NO SCROLL
SCROLL (rolar) especifica que o cursor pode ser utilizado para trazer linhas de uma maneira não seqüencial (por exemplo, para trás). Dependendo da complexidade do plano de execução da consulta, especificar SCROLL pode impor uma penalidade de desempenho no tempo de execução da consulta. NO SCROLL especifica que o cursor não pode ser utilizado para trazer linhas de uma maneira não seqüencial.
WITH HOLD
WITHOUT HOLD
WITH HOLD especifica que o cursor pode continuar sendo utilizado após a transação que o criou ter sido efetivada com sucesso. WITHOUT HOLD especifica que o cursor não pode ser utilizado fora da transação que o criou. Se nem WITHOUT HOLD nem WITH HOLD for especificado, WITHOUT HOLD é o padrão.
consulta
O comando SELECT que produz as linhas a serem retornadas pelo cursor. Consulte o comando SELECT para obter mais informações sobre consultas válidas.
FOR READ ONLY
FOR UPDATE
FOR READ ONLY indica que o cursor será utilizado no modo somente-leitura. FOR UPDATE indica que o cursor será utilizado para atualizar tabelas. Uma vez que atualizações por cursor não são suportadas pelo PostgreSQL no momento, especificar FOR UPDATE causa uma mensagem de erro, e especificar FOR READ ONLY não produz efeito.
coluna
Colunas a serem atualizadas pelo cursor. Uma vez que atualizações por cursor não são suportadas pelo PostgreSQL no momento, a cláusula FOR UPDATE provoca uma mensagem de erro.

As palavras chave BINARY, INSENSITIVE e SCROLL podem estar em qualquer ordem.

Observações

A menos que WITH HOLD seja especificado, o cursor criado por este comando poderá ser utilizado apenas dentro da transação corrente. Portanto, DECLARE sem WITH HOLD não possui utilidade fora do bloco de transação: o cursor existe apenas até o término da instrução. Por esse motivo, o PostgreSQL relata um erro se este comando for utilizado fora de um bloco de transação. Devem ser utilizados os comandos BEGIN , COMMIT e ROLLBACK para definir um bloco de transação.

Se WITH HOLD for especificado, e a transação que criou o cursor for efetivada com sucesso, o cursor pode continuar sendo acessado pelas transações seguintes na mesma sessão (Mas se a transação que o criou for interrompida, o cursor é removido). O cursor criado com WITH HOLD é fechado quando um comando CLOSE explícito é executado para o cursor, ou quando a sessão termina. Na implementação atual, as linhas representadas por um cursor mantido são copiadas para um arquivo temporário, ou para uma área de memória, para permanecerem disponíveis para as transações seguintes.

A opção SCROLL deve ser especificada ao se definir um cursor utilizado para trazer para trás. Isto é requerido pelo padrão SQL. Entretanto, para manter a compatibilidade com as versões anteriores, o PostgreSQL permite trazer para trás sem a opção SCROLL, se o plano da consulta do cursor for simples o suficiente para que nenhum trabalho extra seja necessário para isto. Entretanto, aconselha-se aos desenvolvedores de aplicação a não confiar na utilização de trazer para trás a partir de um cursor que não tenha sido criado com a opção de SCROLL. Se NO SCROLL for especificado, então trazer para trás não é permitido em qualquer caso.

O padrão SQL somente trata de cursores na linguagem SQL incorporada. O servidor PostgreSQL não implementa o comando OPEN para cursores; o cursor é considerado aberto ao ser declarado. Entretanto o ECPG, o pré-processador do PostgreSQL para a linguagem SQL incorporada, suporta as convenções de cursor do padrão SQL, incluindo as que envolvem as instruções DECLARE e OPEN.

Exemplos

Para declarar um cursor:

DECLARE liahona CURSOR FOR SELECT * FROM filmes;

Veja no comando FETCH mais exemplos de utilização de cursor.

Compatibilidade

O padrão SQL permite cursores somente na linguagem SQL incorporada e nos módulos. O PostgreSQL permite que o cursor seja utilizado interativamente.

O padrão SQL permite que os cursores atualizem os dados das tabelas. Todos os cursores do PostgreSQL são somente para leitura.

Os cursores binários são uma extensão do PostgreSQL.

Notas

[1]

big-endian — uma arquitetura de computadores na qual, em uma representação numérica com vários bytes, o byte mais significativo possui o menor endereço (a palavra é armazenada com o "maior-fim-primeiro"). FOLDOC - Free On-Line Dictionary of Computing (N. do T.)

SourceForge.net Logo