Documentação do PostgreSQL 8.0.0 | ||||
---|---|---|---|---|
Anterior | Início | Capítulo 29. ECPG - SQL incorporado à linguagem C | Fim | Próxima |
Esta seção explica como o ECPG trabalha internamente. Às vezes estas informações podem ser úteis para ajudar os usuários a entender como se usa o ECPG.
As quatro primeiras linhas escritas pelo ecpg na saída são linhas fixas. Duas delas são comentários e duas são linhas de inclusão necessárias para interface com a biblioteca. Depois o pré-processador lê o arquivo e escreve a saída. Normalmente, simplesmente reproduz o que foi lido na saída.
Quando encontra uma declaração EXEC SQL faz uma intervenção e muda a declaração. O comando começa por EXEC SQL e termina por ;. Tudo entre estas duas partes é tratado como sendo uma declaração SQL, e analisada para substituição de variável.
A substituição de variável ocorre quando o símbolo começa por dois-pontos (:). A variável com este nome é procurada entre as variáveis que foram previamente declaradas na seção EXEC SQL DECLARE.
A função mais importante da biblioteca é ECPGdo, que toma conta da execução da maioria dos comandos. Recebe um número variável de argumentos. Pode chegar facilmente a 50 argumentos, e se espera que isto não seja um problema em nenhuma plataforma.
Os argumentos são:
Este é o número de linha da linha original; utilizada apenas nas mensagens de erro.
Este é o comando SQL a ser executado. É modificado pelas variáveis de entrada, ou seja, as variáveis que não eram conhecidas na hora da compilação, mas que devem ser introduzidas no comando. As posições onde as variáveis devem ser colocadas contêm ?.
Cada variável de entrada causa a criação de 10 argumentos (veja abaixo).
Um enum informando que não há mais variáveis de entrada.
Cada variável de saída causa a criação de 10 argumento (veja abaixo). Estas variáveis são preenchidas pela função.
Um enum informando que não há mais variáveis.
Para cada variável que faz parte do comando SQL a função recebe 10 argumentos:
O tipo, como um símbolo especial.
Um ponteiro para o valor, ou um ponteiro para um ponteiro.
O tamanho da variável, se for do tipo char ou varchar.
O número de elementos da matriz (para trazer matrizes).
O deslocamento do próximo elemento da matriz (para trazer matrizes).
O tipo da variável indicadora, como um símbolo especial.
Um ponteiro para a variável indicadora.
0
O número de elementos na matriz de indicadores (para trazer matrizes).
O deslocamento do próximo elemento na matriz de indicadores (para trazer matrizes).
Deve ser observado que nem todos os comandos SQL são tratados desta maneira. Por exemplo, uma declaração de abrir cursor como
EXEC SQL OPEN cursor;
não é copiada para a saída. Em vez disso, o comando DECLARE do cursor é utilizado na posição do comando OPEN, porque este realmente abre o cursor.
Abaixo está mostrado um exemplo completo que descreve a saída do pré-processador para o arquivo foo.pgc (podem haver detalhes diferentes entre versões diferentes do pré-processador):
EXEC SQL BEGIN DECLARE SECTION; int index; int result; EXEC SQL END DECLARE SECTION; ... EXEC SQL SELECT res INTO :result FROM mytable WHERE index = :index;
é traduzido em:
/* Processed by ecpg (2.6.0) */ /* These two include files are added by the preprocessor */ #include <ecpgtype.h>; #include <ecpglib.h>; /* exec sql begin declare section */ #line 1 "foo.pgc" int index; int result; /* exec sql end declare section */ ... ECPGdo(__LINE__, NULL, "SELECT res FROM mytable WHERE index = ? ", ECPGt_int,&(index),1L,1L,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_int,&(result),1L,1L,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); #line 147 "foo.pgc"
(Neste caso foram adicionados recuos para ficar mais fácil de ler, mas não é algo que o pré-processador faça)