CREATE OR REPLACE PROCEDURE GLBINF_IntCTB (
vIdentificacao CHAR,
vChave CHAR,
vTamBuffer NUMBER -- número de registros a ser trabalhado por vez
) AS
vSequencial NUMBER (20, 0);
vEmpresa CHAR(2);
BEGIN
DECLARE
vDtMovimento DATE;
vMesDiaAno CHAR(8);
vCodSistema NUMBER(5);
vMes NUMBER(2);
vAno NUMBER(4);
vVersao CHAR(5);
-- recuperação de informações de detalhe
CURSOR Cur_Detalhe_Temp IS
SELECT vEmpresa, vSequencial, Seq, vCodSistema, TO_CHAR(Conta), Descricao, TpConta
FROM GLBInfIntCTBSaldos_D
WHERE Chave = vChave;
CURSOR Cur_Detalhe_Sld IS
SELECT vEmpresa, vSequencial, Seq, vCodSistema, vMes, vAno, TO_CHAR(Conta),
DECODE ( SinalSaldo, '+', Saldo, (Saldo * -1) ) as Saldo
FROM GLBInfIntCTBSaldos_D
WHERE Chave = vChave;
-- array de registros do tipo "linha da tabela apontada por Cur_Detalhe_Temp"
TYPE arrRegDetalhe_Temp IS TABLE OF Cur_Detalhe_Temp%ROWTYPE;
Reg_Detalhe_Temp arrRegDetalhe_Temp;
TYPE arrRegDetalhe_Sld IS TABLE OF Cur_Detalhe_Sld%ROWTYPE;
Reg_Detalhe_Sld arrRegDetalhe_Sld;
BEGIN
SELECT Empresa, CodSistema, mês, Ano
INTO vEmpresa, vCodSistema, vMes, vAno
FROM GLBInfIntCTBSaldos_C
WHERE Chave = vChave;
-- Calcula a DtMovimento
vMesDiaAno := TRIM(TO_CHAR ( vMes, '00')) || '01' || TRIM(TO_CHAR ( vAno, '0000'));
vDtMovimento := TO_DATE( vMesDiaAno, 'mmddyyyy' );
vDtMovimento := LAST_DAY ( vDtMovimento );
-- atualiza e busca o seqüencial de importação
UPDATE InfEmpresas
SET SeqImportacao = NVL(SeqImportacao,0) + 1
WHERE Empresa = vEmpresa;
SELECT SeqImportacao
INTO vSequencial
FROM InfEmpresas
WHERE Empresa = vEmpresa;
SELECT Versao
INTO vVersao
FROM GLBInfIntCTBSaldos_C
WHERE Chave = vChave;
COMMIT;
-- atualiza sequencial no registro do cabeçalho (importante para o tratamento de erros)
UPDATE GLBInfIntCTBSaldos_C
SET RetNroSeqImportacao = vSequencial
WHERE Chave = vChave;
-- cabeçalho da importação no Informes
INSERT INTO InfSequencias (Empresa,Seq,CodArquivo,CodSistema,DtImportacao,dtMovimento,Arquivo,Versao,Validacao)
VALUES ( vEmpresa, vSequencial, 'CTB', vCodSistema, SYSDATE(), vDtMovimento, vIdentificacao, vVersao, 'N');
-- abre o cursor de detalhe, colocando no array N linhas recuperadas de cada vez
OPEN Cur_Detalhe_Temp;
LOOP
FETCH Cur_Detalhe_Temp BULK COLLECT INTO Reg_Detalhe_Temp LIMIT vTamBuffer;
FORALL i IN 1..Reg_Detalhe_Temp.COUNT
INSERT INTO GLBINF_IntCTBv100_A
VALUES Reg_Detalhe_Temp (i) ;
EXIT WHEN Cur_Detalhe_Temp%NOTFOUND;
END LOOP;
CLOSE Cur_Detalhe_Temp;
-- abre o cursor de detalhe, colocando no array N linhas recuperadas de cada vez
OPEN Cur_Detalhe_Sld;
LOOP
FETCH Cur_Detalhe_Sld BULK COLLECT INTO Reg_Detalhe_Sld LIMIT vTamBuffer;
FORALL i IN 1..Reg_Detalhe_Sld.COUNT
INSERT INTO GLBINF_IntCTBv100_B
VALUES Reg_Detalhe_Sld (i);
EXIT WHEN Cur_Detalhe_Sld%NOTFOUND;
END LOOP;
CLOSE Cur_Detalhe_Sld;
-- O Commit deve ser chamado somente no final. Nunca dentro do FORALL
COMMIT;
END;
-- tratamento de erros:
-- lança uma mensagem de erro, capturável pela LYD_Conexao
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
-- lança um erro com a mensagem gerada
raise_application_error (-20000,'Erro na execução da procedure: ' || SQLERRM);
END;
Procedure não funciona no oracle 9i
-
- Rank: Estagiário Júnior
- Mensagens: 1
- Registrado em: Qua, 29 Set 2004 9:57 am
- Localização: Esteio - RS
Tenho esta procedure que esta funcionando no 10G, mas não funciona no 9i, não estou achando o problema. Alguém pode me ajudar vendo esta procedure.
-
- Moderador
- Mensagens: 2016
- Registrado em: Qua, 12 Jan 2005 3:25 pm
- Localização: Araraquara - SP
Abraço,
Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP
Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP
Bom dia pessoal.
O Erro não poderia ser aqui?
O Oracle aceita -20000 como valor para erro?
Não teria que ser -20001 ???
O Erro não poderia ser aqui?
-- tratamento de erros:
-- lança uma mensagem de erro, capturável pela LYD_Conexao
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
-- lança um erro com a mensagem gerada
raise_application_error (-20000,'Erro na execução da procedure: ' || SQLERRM);
Não teria que ser -20001 ???
- Toad
- Rank: DBA Pleno
- Mensagens: 253
- Registrado em: Sex, 18 Nov 2005 2:14 pm
- Localização: Seattle, WA
- Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c
matheus.dev
twitter.com/developer__c
Eu também COSTUMO usar -20001, mas não sei se isso é regra!
Mas seria interessante a gente saber em qual linha dá o erro para uma resposta mais precisa.
Mas seria interessante a gente saber em qual linha dá o erro para uma resposta mais precisa.
-
- Moderador
- Mensagens: 2016
- Registrado em: Qua, 12 Jan 2005 3:25 pm
- Localização: Araraquara - SP
Abraço,
Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP
Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP
Angelo,
Troque o código do erro, para -20001 e faça um teste, pode ser?
Troque o código do erro, para -20001 e faça um teste, pode ser?
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitante