Acessando PostgreSQL com C - Cursores

Veremos neste artigo como trabalhar com cursores através da libpq, utilizando a linguagem C.

[ Hits: 42.308 ]

Por: Poleto em 27/04/2006


Declaração de cursores



Agora que já vimos bastante teoria, é hora de colocar tudo isso em prática. Vale ressaltar que não entraremos em detalhes sobre como conectar com o PostgreSQL ou sobre como executar comandos pela libpq, uma vez que existe um artigo aqui sobre este assunto:
O primeiro passo é a declaração do cursor, que em código SQL, tem a seguinte sintaxe:

DECLARE nome_do_cursor CURSOR FOR comando_select

Isso cria e automaticamente abre um cursor que tem o nome especificado em nome_do_cursor. O cursor fica então vinculado ao comando de select SQL que foi especificado em comando_select. Para codificar o nosso programa, vamos declarar uma variável que irá conter o resultado do comando PQexec (e claro, consideramos que já existe uma conexão aberta com o banco, aqui chamada de conn):

/*Ponteiro de resultado*/ PGresult *result;

e a nossa chamada a função PQexec irá ficar assim:

result = PQexec(conn, "DECLARE curr CURSOR FOR SELECT * FROM contatos");

Até aqui, a única novidade é a declaração do cursor. Vale observar que operações com cursores devem sempre estar entre blocos de transações (assunto grande para ser tratado aqui, nos limitaremos a listar os comandos apenas).

Após a declaração do cursor, iremos recuperar os dados retornados (se algum). Esta operação tem o nome de FETCH, e tem a seguinte sintaxe em SQL:

FETCH [FORWARD|BACKWARD] [number|ALL|NEXT] [IN nome_do_cursor];

Onde:
FORWARD e BACKWARD indicam a direção que o cursor irá ler os dados, para frente e para trás, respectivamente. O padrão é FORWARD e normalmente é omitido;

number, ALL e NEXT indicam quantas linhas iremos recuperar: number deve ser trocado por um número qualquer (10, por exemplo, que indica que 10 linhas serão lidas por vez no cursor). ALL recupera todos os dados e NEXT movimenta o cursor fazendo-o apontar para a próxima linha.

IN indica o cursor em que daremos o fetch.

No nosso caso, podemos declarar o fetch da seguinte forma:

result = PQexec(conn, "FETCH ALL IN curr");

Agora que já temos material o suficiente para criar um cursor e dar um fetch, vamos ver como fica o nosso programa. Omitimos o ponto onde fazemos a conexão com o banco de dados.

result = PQexec(conn, "BEGIN WORK");

/*Executa o comando*/
result = PQexec(conn, "DECLARE curr CURSOR FOR SELECT * FROM contatos");

if(!result)
{
   printf("Erro executando comando. ");
}
else
{
   PQclear(result);
   result = PQexec(conn, "FETCH ALL IN curr");

   switch(PQresultStatus(result))
   {
       case PGRES_EMPTY_QUERY:
           printf("Nada aconteceu. ");
           break;
       case PGRES_TUPLES_OK:
           printf("A query retornou %d linhas. ", PQntuples(result));
           break;
       case PGRES_FATAL_ERROR:
           printf("Error in query: %s ", PQresultErrorMessage(result));
           break;
       case PGRES_COMMAND_OK:
           printf("%s linhas afetadas. ", PQcmdTuples(result));
           break;
       default:
           printf("Algum outro resultado ocorreu. ");
           break;
   }

   result = PQexec(conn, "COMMIT WORK");
          
   /*Libera o nosso objeto de resultado*/
   PQclear(result);
}

Algumas observações sobre o código acima: os comandos 'BEGIN WORK' e 'COMMIT WORK' iniciam e finalizam uma transação, respectivamente. O programa acima irá apenas imprimir na tela a quantidade de linhas que foram retornadas pelo comando select.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Uma breve explicação sobre cursores
   3. Declaração de cursores
   4. Retornando uma linha por vez
   5. Informações sobre colunas
   6. Acessando os dados recuperados
Outros artigos deste autor

Instalando o CMS Drupal 4.7

Acessando PostgreSQL com C

PostgreSQL - Embutindo comandos SQL no seu código C

Leitura recomendada

Usando MySQL na linguagem C

Ensaio acerca de bibliotecas de código aberto para abstração de acesso a banco de dados em linguagem C++

Embutindo um banco de dados SQLite em sua aplicação C++

Acessando PostgreSQL com C

PostgreSQL - Embutindo comandos SQL no seu código C

  
Comentários
[1] Comentário enviado por jragomes em 28/04/2006 - 14:02h

Parabéns pelo artigo, muito bem escrito e detalhado.

[2] Comentário enviado por madsonbraz em 02/05/2006 - 08:53h

Me tire uma duvida, é possivel criar um cluster com o postgresql?

[3] Comentário enviado por poleto em 02/05/2006 - 14:54h

madsonbraz,

E possivel sim, mas eu particularmente nao sei como.

[]'s
Poleto

[4] Comentário enviado por rjesus em 13/03/2007 - 11:20h

Olá, sou novo no linux, utilizoo o SUSE versão 10.1, tentei executar o exemplo que foi passado acima e obtive o seguinte resultado :
suse:/usr/include/pgsql # gcc $(pkg-config --libs --cflags gtk+-2.0) -g teste1.c
/tmp/ccc0dzwL.o: In function `main':
/usr/include/pgsql/teste1.c:13: undefined reference to `PQconnectdb'
/usr/include/pgsql/teste1.c:15: undefined reference to `PQstatus'
/usr/include/pgsql/teste1.c:28: undefined reference to `PQexec'
/usr/include/pgsql/teste1.c:21: undefined reference to `PQerrorMessage'
/usr/include/pgsql/teste1.c:22: undefined reference to `PQfinish'
/usr/include/pgsql/teste1.c:36: undefined reference to `PQresultStatus'
/usr/include/pgsql/teste1.c:42: undefined reference to `PQresultErrorMessage'
/usr/include/pgsql/teste1.c:45: undefined reference to `PQcmdTuples'
/usr/include/pgsql/teste1.c:53: undefined reference to `PQclear'
/usr/include/pgsql/teste1.c:59: undefined reference to `PQfinish'
collect2: ld returned 1 exit status
Alguêm poderia me ajudar ???
Obigado!

[5] Comentário enviado por poleto em 13/03/2007 - 15:04h

Fala rjesus,

Parece que você esqueceu alguns parâmetros para o gcc na hora de executar.
Dá uma olhada neste artigo que tem os detalhes necessários para compilar programas com suporte ao PostgreSQL:

http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=4169

Qualquer coisa grita.
[]'s
Poleto

[6] Comentário enviado por evaldobarbosa em 04/12/2008 - 15:36h

Eu resolvi o problema criando um arquivo que já automatiza esse negócio pra mim, saca só:

#!/bin/bash

rm cursores

g++ -o arquivo -I/usr/include/postgresql/ arquivo.cpp -lpq
#clear
echo ###### executando #####
if [ -x cursores ] ; then
./cursores
fi

exit 0


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts