Procedure não funciona no oracle 9i

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
angelo.dias
Rank: Estagiário Júnior
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.

Selecionar tudo

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;
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Está dando qual erro ?
Qual linha ?
Trevisolli
Moderador
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

Bom dia pessoal.

O Erro não poderia ser aqui?

Selecionar tudo

  -- 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); 

O Oracle aceita -20000 como valor para erro?
Não teria que ser -20001 ???
Avatar do usuário
Toad
Rank: DBA Pleno
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

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.
Trevisolli
Moderador
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

Angelo,

Troque o código do erro, para -20001 e faça um teste, pode ser?
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 10 visitantes