Urgent! Please analyze this piece of code
Date: Mon, 04 Jan 1999 14:13:38 +0000
Message-ID: <3690CC91.F0FAAE95_at_bart.inescn.pt>
Hi,
[Quoted] I'm including a C function from a data loading program in Pro*C. This function selects data from an Oracle 7.1 database on Unix machine, calls
some functions and inserts the data in an Oracle 7.3 database. The query
usually fetches a few hundred records. This process is very fast at first but it starts to lose performance until it's reduced to a crawl. I
noticed that it becomes very slow when it's executing the function calls
between the fetch and the insert.
Thanks,
Marco
void CarregaCCO()
{
Local=1;
printf("Carregamento de avarias do CCO %i\n",cco);
EXEC SQL WHENEVER SQLERROR DO erro(ERROSQL);
EXEC SQL AT BDLocal DECLARE AvariasCarregar CURSOR FOR
SELECT hist,
hist2,
anomalia,
redist,
anomes,
radical,
instal,
cc,
operacao,
sub_operacao,
status,
servico,
tipo_serv,
origem,
num_posto,
prioridade,
psup,
nivel,
segmento,
sintoma,
data_recepcao, hora_recepcao, data_ensaio,
ensaio,
data_dist_g, data_dist_i, hora_dist_i,
equipa,
acl,
resolucao,
data_reposicao, hora_reposicao, data_conclusao, hora_conclusao,
topologia,
orig_aplicacao,
trab_simultaneo,
tip_distr, def_distr, tmp_actuacao, tmp_deslocacao, tmp_previsto,
ptr,
tipo_ca,
tipo_cc,
cod_debbin,
data_fecho
FROM HIST
WHERE CCO=:cco
AND TO_DATE(DATA_CONCLUSAO,'J') BETWEEN TO_DATE(:data_inicio,'dd/mm/yyyy') AND TO_DATE(:data_fim,'dd/mm/yyyy');
EXEC SQL OPEN AvariasCarregar;
while(1) {
EXEC SQL WHENEVER NOT FOUND DO break;
EXEC SQL FETCH AvariasCarregar
INTO :hist:ihist,
:hist2:ihist2,
:anomalia:ianomalia,
:redist:iredist,
:anomes:ianomes,
:radical:iradical,
:instal:iinstal,
:cc:icc,
:operacao:ioperacao,
:sub_operacao:isub_operacao,
:status:istatus,
:servico:iservico,
:tipo_serv:itipo_serv,
:origem:iorigem,
:num_posto:inum_posto,
:prioridade:iprioridade,
:psup:ipsup,
:nivel:inivel,
:segmento:isegmento,
:sintoma:isintoma,
:data_recepcao:idata_recepcao,
:hora_recepcao:ihora_recepcao,
:data_ensaio:idata_ensaio,
:ensaio:iensaio,
:data_dist_g:idata_dist_g,
:data_dist_i:idata_dist_i,
:hora_dist_i:ihora_dist_i,
:equipa:iequipa,
:acl:iacl,
:resolucao:iresolucao,
:data_reposicao:idata_reposicao,
:hora_reposicao:ihora_reposicao,
:data_conclusao:idata_conclusao,
:hora_conclusao:ihora_conclusao,
:topologia:itopologia,
:orig_aplicacao:iorig_aplicacao,
:trab_simultaneo:itrab_simultaneo,
:tip_distr:itip_distr,
:def_distr:idef_distr,
:tmp_actuacao:itmp_actuacao,
:tmp_deslocacao:itmp_deslocacao,
:tmp_previsto:itmp_previsto,
:ptr:iptr,
:tipo_ca:itipo_ca,
:tipo_cc:itipo_cc,
:cod_debbin:icod_debbin,
:data_fecho:idata_fecho;
EXEC SQL AT BDLocal EXECUTE
BEGIN
:rc := geral.rede_cliente(:hist,:cco);
:dur_util_pt :=
Calchoras.duracao(:cco,:hist,null,null,null,null,null,'P','U',null);
:dur_linear_pt :=
Calchoras.duracao(:cco,:hist,null,null,null,null,null,'P','L',null);
:dur_util_cli :=
Calchoras.duracao(:cco,:hist,null,null,null,null,null,'C','U',null);
:dur_linear_cli :=
Calchoras.duracao(:cco,:hist,null,null,null,null,null,'C','L',null);
END;
END-EXEC;
/* ---------------------------------------------------------------
Tratamento dos valores nulos dos campos:
Topologia->1
Serviço->0
Sub_Operação->1
Origem->0
Prioridade->9
Resolução->99
Segmento->R
- */
if(itopologia==-1) { topologia=1; itopologia=1; }
if(iservico==-1) { servico=0; iservico=1; }
if(isub_operacao==-1) { sub_operacao=1; isub_operacao=1; }
if(iorigem==-1) { origem=0; iorigem=1; }
if(iprioridade==-1) { prioridade=9; iprioridade=1; }
if(iresolucao==-1) { resolucao=99; iresolucao=1; }
if(isegmento==-1) {
strcpy(segmento.arr,"R");
segmento.len=strlen(segmento.arr);
isegmento=1;
}
/* ---------------------------------------------------------------
Tratamento dos valores nulos das datas:
Data Conclusão
Data de Fecho
Data de Recepção
Data de Ensaio
Data_Dist_G
Data_Dist_I
Data de Reposição
- */
EXEC SQL AT BDCentral EXECUTE
BEGIN
IF :data_conclusao:idata_conclusao IS NULL THEN
:cdata_conclusao:icdata_conclusao := NULL;
ELSE
:cdata_conclusao:icdata_conclusao :=
TO_DATE(:data_conclusao:idata_conclusao,'J');
END IF;
IF :data_fecho:idata_fecho IS NULL THEN
:cdata_fecho:icdata_fecho := NULL;
ELSE
:cdata_fecho:icdata_fecho := TO_DATE(:data_fecho:idata_fecho,'J');
END IF;
IF :data_recepcao:idata_recepcao IS NULL THEN
:cdata_recepcao:icdata_recepcao := NULL;
ELSE
:cdata_recepcao:icdata_recepcao :=
TO_DATE(:data_recepcao:idata_recepcao,'J');
END IF;
IF :data_ensaio:idata_ensaio IS NULL THEN
:cdata_ensaio:icdata_ensaio := NULL;
ELSE
:cdata_ensaio:icdata_ensaio :=
TO_DATE(:data_ensaio:idata_ensaio,'J');
END IF;
IF :data_dist_g:idata_dist_g IS NULL THEN
:cdata_dist_g:icdata_dist_g := NULL;
ELSE
:cdata_dist_g:icdata_dist_g :=
TO_DATE(:data_dist_g:idata_dist_g,'J');
END IF;
IF :data_dist_i:idata_dist_i IS NULL THEN
:cdata_dist_i:icdata_dist_i := NULL;
ELSE
:cdata_dist_i:icdata_dist_i :=
TO_DATE(:data_dist_i:idata_dist_i,'J');
END IF;
IF :data_reposicao:idata_reposicao IS NULL THEN
:cdata_reposicao:icdata_reposicao := NULL;
ELSE
:cdata_reposicao:icdata_reposicao :=
TO_DATE(:data_reposicao:idata_reposicao,'J');
END IF;
END;
END-EXEC;
EXEC SQL AT BDCentral
INSERT INTO AVARIAS
(hist,
zona,
cco,
status,
data_fecho,
resolucao,
prioridade,
servico,
segmento,
origem,
hist2,
anomalia,
redist,
anomes,
radical,
instal,
cc,
operacao,
sub_operacao,
num_posto,
psup,
nivel,
sintoma,
data_recepcao,
hora_recepcao,
data_ensaio,
ensaio,
data_dist_g,
data_dist_i,
hora_dist_i,
equipa,
acl,
data_reposicao,
hora_reposicao,
data_conclusao,
hora_conclusao,
topologia,
orig_aplicacao,
trab_simultaneo,
tip_distr,
def_distr,
tmp_actuacao,
tmp_deslocacao,
tmp_previsto,
ptr,
tipo_ca,
tipo_cc,
cod_debbin,
tipo_serv,
rc,
dur_util_pt,
dur_linear_pt,
dur_util_cli,
dur_linear_cli)
values (:hist,
:zona,
:cco,
:status,
:cdata_fecho:icdata_fecho,
:resolucao:iresolucao,
:prioridade:iprioridade,
:servico:iservico,
:segmento:isegmento,
:origem:iorigem,
:hist2:ihist2,
:anomalia:ianomalia,
:redist:iredist,
:anomes:ianomes,
:radical:iradical,
:instal:iinstal,
:cc:icc,
:operacao:ioperacao,
:sub_operacao:isub_operacao,
:num_posto:inum_posto,
:psup:ipsup,
:nivel:inivel,
:sintoma:isintoma,
:cdata_recepcao:icdata_recepcao,
:hora_recepcao:ihora_recepcao,
:cdata_ensaio:icdata_ensaio,
:ensaio:iensaio,
:cdata_dist_g:icdata_dist_g,
:cdata_dist_i:icdata_dist_i,
:hora_dist_i:ihora_dist_i,
:equipa:iequipa,
:acl:iacl,
:cdata_reposicao:icdata_reposicao,
:hora_reposicao:ihora_reposicao,
:cdata_conclusao:icdata_conclusao,
:hora_conclusao:ihora_conclusao,
:topologia:itopologia,
:orig_aplicacao:iorig_aplicacao,
:trab_simultaneo:itrab_simultaneo,
:tip_distr:itip_distr,
:def_distr:idef_distr,
:tmp_actuacao:itmp_actuacao,
:tmp_deslocacao:itmp_deslocacao,
:tmp_previsto:itmp_previsto,
:ptr:iptr,
:tipo_ca:itipo_ca,
:tipo_cc:itipo_cc,
:cod_debbin:icod_debbin,
:tipo_serv:itipo_serv,
:rc,
:dur_util_pt,
:dur_linear_pt,
:dur_util_cli,
:dur_linear_cli);
EXEC SQL AT BDCentral INSERT INTO DIAS_CALCULAR (data)
VALUES(:cdata_conclusao:icdata_conclusao);
EXEC SQL AT BDCentral COMMIT;
}
EXEC SQL CLOSE AvariasCarregar;
} Received on Mon Jan 04 1999 - 15:13:38 CET
