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