Acessando Banco de Dados - Mysql e Postgresql
Acessando Banco de Dados - Mysql e Postgresql
Accessing Database - Mysql and Postgresql
Luiz Sérgio Araújo Morais - netmoraisap@gmail.com
Resumo
Este artigo tem o objetivo de demonstrar, de um modo prático, que é possível por meio de interfaces simples acessar e manipular dados nos bancos mais populares, utilizando recursos básicos e linguagens comuns, sem a necessidade de drives especiais, que geralmente são pagos, possibilitando um custo de desenvolvimento e manutenção reduzidos e padronizados.
Metodologia
Para materializar o proposto será construída uma "interface servidora" em C, utilizando os recursos da biblioteca "mysqlclient", composta de funções que permitem o acesso ao banco de dados Mysql. Veja: Usando MySQL na linguagem C. É importante destacar que existem soluções análogas para outros bancos de dados, tais como a biblioteca "libpq" do Postgresql, para detahes veja: Acessando PostgreSQL com C.
Do lado da aplicação serão construídos duas "consoles clientes", uma em Cobol e outra com o Bash, a fim de demonstrar a independência da metodologia com respeito à linguagem utilizada. As "consoles" representam o lado da aplicação, e podem ser vistas como os "Controle de Clientes, de Fornecedores, etc". Já a comunicação entre os módulos cliente e servidor será feita através de um sistema de mensagens baseado em arquivos, mas pode ser substituído por métodos mais eficientes, tais como: chamada direta da interface pelo módulo cliente, passando e recebendo as informações via memória, tal como por exemplo no caso do Cobol, "call interface using solicitação retorno", ou utilizando um protocolo de envio e recebimento de dados, como Tcp. A seguir, procedimentos de instalação encontrados em "dem_pt.tar.gz".
Requisitos
Distribuição Linux, com o Bash, Mysql com Mysqlclient e Cobol Micro Focus instalados.
Procedimentos
Copiar para uma pasta os arquivos descritos a seguir:
1. demosh - script para executar a aplicacao em bash
#!/bin/bash
# demosh - script utlizando bash
# identifica o id do processo
idproc=$$;
# cria os arquivos
mkfifo -m 777 democ-$idproc ; > demoi-$idproc ; > demoo-$idproc
> demof-$idproc ; chmod 777 demoi-$idproc demoo-$idproc demof-$idproc
# displara a interface servidora
demosrv.exe $idproc &
# executa a aplicacao cliente
sh ./democon.sh $idproc ;
# remove os arquivos
if test democ-$idproc ; then rm -f democ-$idproc ; fi
if test -f demoi-$idproc ; then rm -f demoi-$idproc ; fi
if test -f demoo-$idproc ; then rm -f demoo-$idproc ; fi
if test -f demof-$idproc ; then rm -f demof-$idproc ; fi
2. democob - script em bash para executar a aplicação em cobol
#!/bin/bash
# democob - script utlizando cobol
# identifica o id do processo
idproc=$$;
# cria os arquivos
mkfifo -m 777 democ-$idproc ; > demoi-$idproc ; > demoo-$idproc
> demof-$idproc ; chmod 777 demoi-$idproc demoo-$idproc demof-$idproc
# displara a interface servidora
demosrv.exe $idproc &
# executa a aplicacao cliente
cobrun democon.int $idproc,,, ;
# remove os arquivos
if test democ-$idproc ; then rm -f democ-$idproc ; fi
if test -f demoi-$idproc ; then rm -f demoi-$idproc ; fi
if test -f demoo-$idproc ; then rm -f demoo-$idproc ; fi
if test -f demof-$idproc ; then rm -f demof-$idproc ; fi
3. democon.sh - script da "console cliente" em bash
#!/bin/bash
# democon
# recebe id do processo
idproc=$1;
mpro="bash-mysql: informe comando ou f para encerrar"
# prepara nomes de arquivos
democ=`echo "democ-$idproc"`
demoi=`echo "demoi-$idproc"`
demoo=`echo "demoo-$idproc"`
demof=`echo "demof-$idproc"`
clear
while true ; do
# recebe comando sql
echo "$mpro"; read ope
# grava no arquivo de solicitacoes
echo "$ope" > $demoi
# libera servidor
echo > $democ
# verifica solicitacao de fim
if [ "$ope" == "f" ] ; then break ; fi
# aguarda o servidor
read < $democ
# le arquivo de estado e exibe
echo "estado" ; cat $demof
# le arquivo de saida e exibe
echo "resultado" ; cat $demoo
done
4. democon.cbl - fonte da "console cliente" em cobol
identification division.
program-id. democon.
environment division.
configuration section.
special-names.
console is crt
decimal-point is comma.
input-output section.
file-control.
select opee assign to opee-dat
organization line sequential status est.
select opes assign to opes-dat
organization line sequential status est.
select opef assign to opef-dat
organization line sequential status est.
select opec assign to opec-dat
organization line sequential status est.
data division.
file section.
fd opee
record is varying 1 to 8192 depending on treg.
01 ropee pic x(8192).
fd opes
record is varying 1 to 8192 depending on treg.
01 ropes pic x(8192).
fd opef.
01 ropef pic x(35).
fd opec.
01 ropec pic x.
working-storage section.
01 est pic xx.
01 opee-dat pic x(35) value space.
01 opes-dat pic x(35) value space.
01 opef-dat pic x(35) value space.
01 opec-dat pic x(35) value space.
01 ope pic x(8192).
01 treg pic 9(4).
01 preg pic 9(4).
01 nproc pic x(35) value space.
01 cmd pic x(80).
01 mpro pic x(78).
01 par pic x(256) value space.
procedure division.
inicio.
accept par from command-line.
*******recebe id do processo
unstring par delimited by "," into nproc.
display space upon crt.
move "cobol-mysql: informe comando ou f para encerrar"
to mpro.
*******prepara nomes de arquivos
move space to opee-dat string "demoi-" nproc
delimited by " " into opee-dat.
move space to opes-dat string "demoo-" nproc
delimited by " " into opes-dat.
move space to opef-dat string "demof-" nproc
delimited by " " into opef-dat.
move space to opec-dat string "democ-" nproc
delimited by " " into opec-dat.
*******recebe comando sql
proc.
display mpro upon console.
move space to ope accept ope from console.
*******grava no arquivo de solicitacoes
abr-opee.
open output opee.
if est = "9a" close opee go to abr-opee.
if est not = "00"
display "erro na abertura da entrada"
upon console stop run.
move ope to ropee.
perform ver-topee thru fim-topee.
write ropee.
if est not = "00"
display "erro na gravacao da entrada"
upon console stop run.
close opee.
*******libera servidor
lib-srv.
open output opec.
if est = "9a" close opec go to vrf-fim.
if est not = "00"
display "erro na abertura do controle"
upon console stop run.
close opec.
*******verifica solicitacao de fim
vrf-fim.
if ope = "f" stop run.
*******aguarda o servidor
esp-srv.
open input opec.
if est = "9a" close opec go to esp-srv.
if est not = "00"
display "erro na abertura do controle"
upon console stop run.
ler-opec.
read opec end close opec go to abr-opef.
if est = "9d" go to ler-opec.
if est not = "00"
display "erro na leitura do controle"
upon console stop run.
close opec.
*******le arquivo de estado
abr-opef.
open input opef.
if est = "9a" close opef go to abr-opef.
if est not = "00"
display "erro na abertura do estado"
upon console stop run.
ler-opef.
read opef end close opef go to ler-opes.
if est = "9d" go to ler-opef.
if est not = "00"
display "erro na leitura do estado"
upon console stop run.
display "estado" upon console.
display ropef upon console.
close opef.
*******le arquivo de saida
abr-opes.
open input opes.
if est = "9a" close opes go to abr-opes.
if est not = "00"
display "erro na abertura da saida"
upon console stop run.
display "resultado" upon console.
ler-opes.
read opes end go to clo-opes.
if est = "9d" go to ler-opes.
if est not = "00"
display "erro na leitura da saida"
upon console stop run.
move ropes to ropee.
perform ver-topee thru fim-topee.
*******exibe a saida
display ropes (1:treg) upon console.
go to ler-opes.
*******fecha e retorna
clo-opes.
close opes go to proc.
*******verifica o tamanho p/ gravacao
ver-topee.
if ropee = space move zero to treg go to fim-topee.
move 0128 to treg.
if ropee (0129:8064) = space go to ver-topee1.
move 0256 to treg.
if ropee (0257:7936) = space go to ver-topee1.
move 0512 to treg.
if ropee (0513:7680) = space go to ver-topee1.
move 1024 to treg.
if ropee (1025:7168) = space go to ver-topee1.
move 2048 to treg.
if ropee (2049:6144) = space go to ver-topee1.
move 4096 to treg.
if ropee (4097:4096) = space go to ver-topee1.
move 8192 to treg.
ver-topee1.
if treg = zero go to fim-topee.
if ropee (treg:1) not = space go to fim-topee.
subtract 1 from treg go to ver-topee1.
fim-topee.
exit.
5. demosrv.c - fonte da "interface servidora" em c
/* demosrv */
#include <my_global.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <mysql.h>
MYSQL conn; MYSQL_RES *resp; MYSQL_FIELD *cpo; MYSQL_ROW lin;
char papl [35] = "", ent [8192] = "", cmd [8192] = "";
char opeedat [35] = "", opesdat [35] = "";
char opefdat [35] = "", opecdat [35] = "";
char terr [5] = "", cerr [5] = "", merr [70] = "", serr [70] = "";
char scmd [8192] = "";
int nlin, ncol, nerr, ind, res;
char m00501 [70] = "MENS: retorno nulo";
char eZZ001 [70] = "ERRO: entrada nao aberta";
char eZZ002 [70] = "ERRO: entrada nao lida";
char eZZ003 [70] = "ERRO: processo nao informado";
char eZZ004 [70] = "ERRO: conexao nao estabelecida";
char eZZ005 [70] = "ERRO: estado nao aberto";
char eZZ006 [70] = "ERRO: estado nao gravado";
char eZZ007 [70] = "ERRO: saida nao aberta";
char eZZ008 [70] = "ERRO: saida nao gravada";
char eZZ011 [70] = "ERRO: controle nao aberto";
char eZZ012 [70] = "ERRO: controle nao lido";
FILE *opee, *opes, *opef, *opec;
main (argc, argv)
int argc; char *argv[];
{
inicio:
/* verifica id do processo */
if (argc > 0 && argv [1] != NULL) {strcpy (papl, argv [1]);}
else {strcpy (cerr, "ZZ003"); strcpy (merr, eZZ003); goto erro;}
/* conecta banco */
mysql_init (&conn); mysql_real_connect (&conn, "localhost",
"demo", "demo", "demo", 0, NULL, 0); nerr = mysql_errno (&conn);
if (nerr != 0 )
{strcpy (cerr, "ZZ004"); strcpy (merr, eZZ004); goto erro;}
/* prepara nomes de arquivos */
strcpy (opeedat, "demoi-"); strcat (opeedat, papl);
strcpy (opesdat, "demoo-"); strcat (opesdat, papl);
strcpy (opefdat, "demof-"); strcat (opefdat, papl);
strcpy (opecdat, "democ-"); strcat (opecdat, papl);
proc0:
/* espera cliente */
strcpy (ent, ""); opec = fopen (opecdat, "r");
if (opec == NULL || ferror (opec))
{strcpy (cerr, "ZZ011"); strcpy (merr, eZZ011); goto erro;}
fgets (ent, 1, opec);
if (ferror (opec))
{strcpy (cerr, "ZZ012"); strcpy (merr, eZZ012); goto erro;}
fclose (opec);
/* abre e le arquivo entrada */
strcpy (ent, ""); opee = fopen (opeedat, "r+");
if (opee == NULL || ferror (opee))
{strcpy (cerr, "ZZ001"); strcpy (merr, eZZ001); goto erro;}
proc1:
fgets (ent, 8192, opee);
if (ferror (opee))
{strcpy (cerr, "ZZ002"); strcpy (merr, eZZ002); goto erro;}
fclose (opee);
if (strncmp ("f", ent, 1) == 0 && strlen (ent) == 2) {goto fim;}
/* executa o comando */
strcpy (cmd, ent); mysql_query (&conn, cmd);
/* verifica execucao */
nerr = mysql_errno (&conn);
resp = mysql_store_result (&conn);
if (resp == NULL) {nlin = 0;} else
{nlin = mysql_num_rows (resp);}
if (nerr == 0 && nlin != 0) {strcpy (cerr, "00000");}
if (nerr == 0 && nlin == 0) {strcpy (cerr, "00501");}
if (nerr != 0) {sprintf (terr, "%i", nerr);
strcpy (cerr, "0"); strcat (cerr, terr);}
/* abre e escreve estado */
opef = fopen (opefdat, "w+");
if (opef == NULL || ferror (opef))
{strcpy (cerr, "ZZ005"); strcpy (merr, eZZ005); goto erro;}
strcpy (serr, cerr); strcat (serr, "\n") ; fputs (serr, opef);
if (ferror (opef))
{strcpy (cerr, "ZZ006"); strcpy (merr, eZZ006); goto erro;}
fclose (opef);
/* abre e escreve saida */
opes = fopen (opesdat, "w+");
if (opes == NULL || ferror (opes))
{strcpy (cerr, "ZZ007"); strcpy (merr, eZZ007); goto erro;}
/* execucao com saida nula */
if (strncmp ("00501", cerr, 5) == 0)
{strcpy (serr, m00501); strcat (serr, "\n"); fputs (serr, opes);
if (ferror (opes))
{strcpy (cerr, "ZZ008"); strcpy (merr, eZZ008); goto erro;}
fclose (opes) ; goto proc2;}
/* execucao com erro */
if (strncmp ("00000", cerr, 5) != 0)
{strcpy (serr, "ERRO: "); strcat (serr, mysql_error (&conn));
strcat (serr, "\n"); fputs (serr, opes);
if (ferror (opes))
{strcpy (cerr, "ZZ008"); strcpy (merr, eZZ008); goto erro;}
fclose (opes) ; goto proc2;}
/* execucao com saida */
if (resp == NULL) {fclose (opes); goto proc2;}
while ((lin = mysql_fetch_row (resp)) != NULL)
{cpo = mysql_fetch_fields (resp); strcpy (scmd, "");
ncol = mysql_num_fields (resp);
for (ind = 0; ind < ncol; ind++)
{strcat (scmd, lin [ind]);
if (cpo [ind].length < 256 &&
strlen (lin [ind]) < cpo [ind].length)
{res = cpo [ind].length - strlen (lin [ind]);
while (res != 0) {strcat (scmd, " "); res--;}}}
strcat (scmd, "\n"); fputs (scmd, opes);
if (ferror (opes))
{strcpy (cerr, "ZZ008"); strcpy (merr, eZZ008); goto erro;}}
fclose (opes);
proc2:
/* libera objeto e cliente */
mysql_free_result (resp);
opec = fopen (opecdat, "w");
if (opec == NULL || ferror (opec))
{strcpy (cerr, "ZZ011"); strcpy (merr, eZZ011); goto erro;}
fclose (opec); goto proc0;
fim:
/* desfaz a conexao */
mysql_close (&conn);
exit (0);
erro:
/* abre e escreve estado */
opef = fopen (opefdat, "w+");
if (opef == NULL || ferror (opef)) {goto dspe;}
strcpy (serr, cerr); strcat (serr, "\n") ; fputs (serr, opef);
if (ferror (opef)) {goto dspe;}
fclose (opef);
/* abre e escreve saida */
opes = fopen (opesdat, "w+");
if (opes == NULL || ferror (opes)) {goto dspe;}
strcpy (serr, merr); strcat (serr, "\n"); fputs (serr, opes);
if (ferror (opes)) {goto dspe;}
fclose (opes) ; goto fim;
dspe:
printf ("%s\n%s\n", cerr, merr); goto fim;
}
6. demo.txt - tabela demo para ser carregada no banco
000001|MUOIL DTMANGOIS DU SALVU
000002|UPTLTNAT BUCASCU DT NUSEAMINCT
000003|U E PIRIARU
000004|U G V RIPRISINCUETIS I VINDUS
000005|U GUREAU LUJU LCDU
000006|UNDRI GTNSULVIS DI TLAVIARU
000007|U M ERASCTVUT & ERASCTVUT LCDU
000008|PRIFIACORU MONAEAPUL DI EOBUCU
000009|U P DI EUSCRT
000010|MURAT LTCCT
000011|U PIQOINANU EINCRT ISCICAET S/
000012|U CRUNSPTRCUDTRU I URROMUDTRU
000013|U CRABONU DI SUNCTS JTRNUL I I
000014|E S S
000015|JTSI GTNEULVIS
000016|U DU INEURNUEUT BIRNURDT & EAU
000017|U. FIRRIARU NICT
000018|JTSI RTGIRAT DI UMTRAM
000019|U.P. EURVULHT CRUNSPTRCIS LCDU
000020|U S KUMURUOSKUS
7. Abra uma sessão no Linux
7.1. Crie um usuario "demo" no Mysql
mysql -u root -p
grant all privileges on *.* to demo@localhost identified by 'demo';
flush privileges;
quit
7.2. Acesse o mysql como "demo" e crie o banco "demo"
mysql -u demo -p
create database demo;
quit
7.3. Crie a tabela demo e carregue demo.txt
mysql -u demo -p demo
create table demo (codigo char (0006), descricao char (0030));
load data infile 'pwd/demo.txt' into table demo fields terminated by '|' (codigo, descricao);
substitua "pwd" pelo "encaminhamento de sua pasta/diretorio, i.e /home/abc/..."
7.4. Verifique se os dados foram carregados e encerre
select * from demo limit 5;
codigo descricao
000001 MUOIL DTMANGOIS DU SALVU
000002 UPTLTNAT BUCASCU DT NUSEAMINCT
000003 U E PIRIARU
000004 U G V RIPRISINCUETIS I VINDUS
000005 U GUREAU & LUJU LCDU
quit
7.5. Compile a "inteface em c"
gcc demosrv.c -l mysqlclient -o demosrv.exe
7.6. Compile a "console em cobol"
cob -iv democon.cbl
7.7. Execute a aplicação em cobol ou bash
sh ./democob ou sh ./demosh
Informe um sql certo:
bash ou cobol-mysql: informe comando ou f para encerrar
select * from demo limit 10
estado
00000
resultado
000001MUOIL DTMANGOIS DU SALVU
000002UPTLTNAT BUCASCU DT NUSEAMINCT
000003U E PIRIARU
000004U G V RIPRISINCUETIS I VINDUS
000005U GUREAU & LUJU LCDU
000006UNDRI GTNSULVIS DI TLAVIARU
000007U M ERASCTVUT & ERASCTVUT LCDU
000008PRIFIACORU MONAEAPUL DI EOBUCU
000009U P DI EUSCRT
000010MURAT LTCCT
Informe um sql com retorno nulo:
bash ou cobol-mysql: informe comando ou f para encerrar
select * from demo where codigo > '90000'
estado
00502
resultado
MENS: retorno nulo
Informe um sql errado:
bash ou cobol-mysql: informe comando ou f para encerrar
comando errado
estado
01064
resultado
ERRO: You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near 'comando errado' at
line 1
Solicite o encerramento:
bash ou cobol-mysql: informe comando ou f para encerrar
f
Utilização
A seguir, algumas propostas para utilização e melhoria da metodologia em sua totalidade, em parte ou com ajustes e otimizações:
Admite melhorias, como as já descritas, em relação ao meio de comunicaçao entre módulos, por meio do uso de memória compartilhada, utilização do protocólo Tcp, isoladamente ou combinados, isto é, a mesma interface pode trabalhar simultaneamente com mais de uma forma de comunicação, e esta forma pode ser decidida em tempo de execução.
Permite que aplicações construidas com linguagens distintas acessem o mesmo banco de dados. Isto pode ser observado, executando duas sessões simultâneas, uma com o Bash, "demosh" e outra com o Cobol, "democob" acessando o mesmo banco e tabela.
Viabiliza o acesso a bancos de dados diferentes pela mesma aplicação. Basta que consideremos por exemplo que sejam construidas duas interfaces servidoras distintas, uma para Mysql, já demonstrada, e outra para Postgresql, com a mesma metodologia, e que as duas interfaces, de acordo com algum critério pre-estabelecido, nome de banco por exemplo, use o Mysql ou Postgresql simultaneamente.
Consequentemente é possivel também a combinação das duas caracteristicas anteriores, ou seja multiplas aplicações com multiplos bancos,
facilitando por exemplo, a construção de aplicações como "e-commerce", onde queremos disponibilizar aos utilizadores uma informação que
quase sempre é oriunda de várias aplicações e vários bancos de dados diferentes, condensados em uma visão única.
Uso de esquemas middleware para a camada de acesso a dados, ou seja, a solução pode prever um lugar comum, um barramento de integração, local onde todos os sistemas envolvidos, por meio de por exemplo uma "metalinguagem de acesso", enviam e recebem suas requisições de acesso e manipulação de dados, de forma totalmente independente de qual banco irá providenciar as informações, veja uma solução análoga, com relação ao desenvolvimento de Interface Web para Usuários em: Migração de Aplicações para Ambiente Web.
Ainda com relação à "metalinguagem de acesso", sua utilização permite com segurança o uso das famosas "extenções sql", que são temidas pelos desenvolvedores pois são específicas, mas têm a vantagem de demonstrarem maior eficiência no seu uso em um determinado banco de dados.
Em relação especificamente ao Cobol Microfocus, os "reads" e "writes" podem ser vistos, do ponto de vista do Sql, como uma "metalinguagem". É possível então, construir um middleware para acesso à dados, com um módulo que intercepte as chamados ao "extfh", mecanismo de acesso nativo do sistema, e mapeie estes os comandos para os "equivalentes" em sql. O resultado prático desta metodologia encontra-se em "Testes" a seguir.
Testes
Para execuçao de testes práticos com esta metodologia foi selecionada uma aplicação real composta de 27 tabelas, com aproximadamente 2 milhões de registros/linlhas instalada numa distribução Linux do mesmo perfil da demonstração já proposta obtendo-se o seguintes resultados:
1. Tempo de conversão dos programas da aplicação de Cobol para banco de dados Mysql e Postgressql - zero.
De fato, não existe tempo de conversão. Um programa escrito em Cobol intercepta as chamadas do "extfh" e com informações de que está em um "ambiente Mysql" por exemplo, mapeia com base numa tabela, veja abaixo, os "reads" e "whites" para os "selects" e "inserts", de acordo com as colunas descritas a seguir:
Op: código da operação; Descrição; Opm: modo de abertura; Lcm: modo de bloqueio; Etapa: etapas de mapeamento, por exemplo. cob - comandos cobol, lk? - sqls de controle de desbloqueio, bloqueio e liberação, sop - sql de abertura, sql - sql propriamente dito (read, write,...), etc; Mf ou Sql: resumo do comando Cobol ou Sql; Condições: condições esperadas com o resultado do comando; Sql c/r e s/r: código de retorno do banco de dados resultante das operações com e sem dado retornado; e St Mf: file-status padrão Micro Focus a ser retornado.
Tabela de mapeamento comandos Cobol MIcro Focus para Sql Mysql/Postgresql
2. Tempo de conversão dos dados de arquivos Cobol para banco de dados Mysql e Postgressql - média de 9 minutos.
Esta fase ocorre apenas na "carga" do sistema ou quando for necessária alguma alteração na estrutura das tabelas. Consiste da criação automática das descrições das tabelas, com base nas descrições dos arquivos Cobol pré-existentes e posterior cópia dos dados.
3. Na utilização normal do sistema, comparando os tempos de acesso do Cobol com o Mysq e Postgresq, nas opções de uso diário, tais como, manutenção da base, consultas e relatórios que em geral trabalham com um número reduzido de registros/linhas, a diferença é imperceptível. Já nos casos nos quais estão envolvidos grandes quantidades de resgistros/linhas, tais como, processos gerais de cálculo, nota-se lentidão nos acessos às tabelas dos bancos de dados. Para que se tenha uma idéia, um processo de simples cópia de uma tabela de 40.000 registros/linhas que no Cobol leva cerca de 6,40 segundos, no Mysql obtemos 245,34 segundos e no Postgresql 283,56 segundos o que é uma diferença bastante significativa.
Conclusões
A metodologia, embora atraente nas questões de custo e tempo de implantação e manutenção, facilidade de conversão e integração, não se comporta adequadamente para grandes volumes, no caso de conversão automática utilizando o Cobol. Ao se observar o ciclo de cópia, como o já apresentado, nota-se que dentro de cada ciclo, a fase que consome mais tempo é a de comunicação entre os módulos "mapeador cliente" e a "interface servidora" utilizando o sistema de mensagens em arquivos. Acredita-se que a adoção de outras técnicas de comunicação, substituindo ou combinando com a já existente, tais como as já mencionadas, venham minimizar bastante o problema. Por outro lado, este é um problema que ocorre em uma situação bastante específica, ou seja, no caso de utilização com o Cobol nas condições de conversão automática do sistema. Deve-se considerar que as aplicações escritas em Cobol têm em geral por natureza a característica de acessar os registros/linhas um a um, mesmo para grandes volumes, já os Bancos de Dados, acessados com o Sql trabalham naturalmente mais rápido quando os comandos para grandes volumes já forem escritos com a idéia de um conjunto de linhas de uma só vez. Nada impede portanto a utilização da metodologia, com qualquer linguagem, mesmo Cobol, na condição em que os procedimentos para grandes volumes tenham comandos Sqls específicos, o que implicaria na re-escrtita do código, portanto não se aproveitando na sua totalidade os benefícios apontados na conversão automática das aplicações.
Referências
1. Usando MySQL na linguagem C de Ricardo R Lucca. Usando MySQL na linguagem C
2. Acessando PostgreSQL com C - Poleto. Acessando PostgreSQL com C
3. Migração de Aplicações para Ambiente Web - Luiz Sérgio Araújo Morais. Migração de Aplicações para Ambiente Web - Uma Abordagem Prática