StoredProc usando dbExpress e Oracle

16/05/2008

1

[color=red:48de663024]Título editado por Massuda Por favor, não use apenas letras maiúsculas no título/texto. Leia as :arrow: [url=http://forum.clubedelphi.net/viewtopic.php?t=6689]Regras de Conduta[/url] do fórum.[/color:48de663024]

pessoal, bom dia....

estou com o seguinte problema: tenho um sistema de importação de arquivos da Unimed rodando há vários anos, que faz importação de internações e procedimentos ambulatoriais, segundo layout pré-definido....

basicamente, foi migrado a versão do servidor Oracle (base de dados) do 9i para o 10g, e alguns programas auxiliares pararam de funcionar....

neste em específico, quando eu rodo a importação na base do Oracle 9i, ele ainda funciona corretamente, importando todos os dados.... mudando para a base do 10g, no mesmo executável, mesma máquina, mesmo arquivo de importação, mesma pasta (ou seja, mesmas dlls do dbexpress), ele dá erro em uma procedure do Oracle, retornando a mensagem:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "PRODUCAO.PIMP_VERIFICAGUIASENHA2", line 187
ORA-01403: no data found
ORA-01403: no data found
ORA-06512: at line 1


peguei então os parâmetros que o Delphi está enviando para a procedure do Oracle, e rodei no PL/SQL Developer, esperando encontrar o mesmo erro.... só que no PL/SQL funcionou....

aqui estão os códigos de dentro do Delphi, da chamada da procedure:

with DM_ImpHosp.SQLSP_VerificaGuiaSenha2 do
begin
  Close;
  SQLConnection := DM_ImpHosp.SQLC_Geral;
  StoredProcName := ´PIMP_VERIFICAGUIASENHA2´;
  Params.ParamByName(´P_SENHA´).AsString := s_Senha;
  Params.ParamByName(´P_NUMPAC´).AsString := s_CdAreaAcao + s_NrContrato + s_NrFamilia + s_TpUsuario + s_NrDigito;
  Params.ParamByName(´P_NRDOC´).AsString := sNrDoc;
  Params.ParamByName(´P_NRLOTE´).AsString := s_NrLote;
  Params.ParamByName(´P_USUARIO´).AsString := v_Usuario;
  Params.ParamByName(´P_CDPRESTADOR´).AsString := s_CdPrestador;
  try
    ExecProc;
  except
    on E: Exception do
    begin
      MessageDlg(´A procedure "´ + StoredProcName + ´" não pôde ser executada corretamente.´ + #1310 + 1310 +
                 ´Erro: ´ + E.Message, mtWarning, [mbOK], 0);
      Exit;
    end;
  end;
end;


e aqui os códigos da procedure do Oracle:

CREATE OR REPLACE PROCEDURE PIMP_VERIFICAGUIASENHA2
( P_SENHA           IN  VARCHAR2,
  P_NUMPAC          IN  VARCHAR2,
  P_NRDOC           IN  VARCHAR2,
  P_NRLOTE          IN  VARCHAR2,
  P_USUARIO         IN  VARCHAR2,
  P_CDPRESTADOR     IN  VARCHAR2,
  V_CDSERIE_GUIA    OUT VARCHAR2,
  V_CDTIPO_GUIA     OUT VARCHAR2,
  V_NRGUIA          OUT VARCHAR2,
  V_TXSENHA_AUTORIZ OUT VARCHAR2,
  V_CDSERIE         OUT VARCHAR2,
  V_NUMGUIA         OUT VARCHAR2,
  V_CONTINUA        OUT VARCHAR2,
  V_MSG             OUT VARCHAR2,
  V_ERRCODE         OUT VARCHAR2,
  V_ONDEACHOUGUIA   OUT VARCHAR2,
  V_CDSITUACAO_GUIA OUT VARCHAR2,
  V_QTDSERVICO      OUT NUMBER )
IS
  V_SER VARCHAR2(2);
  V_NR  VARCHAR2(8);
  SMSG  VARCHAR2(50);
BEGIN
  SELECT COUNT(ROWNUM)
  INTO V_QTDSERVICO
  FROM CSMH2 A, CSMH1 B
  WHERE B.NRDOC = A.NRDOC AND REPLACE(REPLACE(REPLACE(REPLACE(B.SENHA, ´ ´, ´´), ´-´, ´´), ´.´, ´´), ´,´, ´´) = P_SENHA;

  V_ONDEACHOUGUIA := ´N´;

  SELECT CDSERIE_GUIA, CDTIPO_GUIA, NRGUIA, TXSENHA_AUTORIZ, CDSITUACAO_GUIA
  INTO V_CDSERIE_GUIA, V_CDTIPO_GUIA, V_NRGUIA, V_TXSENHA_AUTORIZ, V_CDSITUACAO_GUIA
  FROM GUIA_DE_SERVICO
  WHERE TXSENHA_AUTORIZ = P_SENHA
    AND NRAREA_ACAO = SUBSTR(P_NUMPAC, 1, 3) AND NRCONTRATO = SUBSTR(P_NUMPAC, 4, 4)
    AND NRFAMILIA = SUBSTR(P_NUMPAC, 8, 6)   AND TPUSUARIO = SUBSTR(P_NUMPAC, 14, 2)
    AND NRDIGITO = SUBSTR(P_NUMPAC, 16, 1)
    AND (CDPRESTADOR IS NULL OR CDPRESTADOR = P_CDPRESTADOR);

  BEGIN
    V_CDSERIE       := V_CDSERIE_GUIA;
    V_NUMGUIA       := V_NRGUIA;
    V_CONTINUA      := ´TRUE´;
    V_ONDEACHOUGUIA := ´G´;
    RETURN;
  END;

EXCEPTION
  WHEN INVALID_NUMBER THEN
  BEGIN
    V_CONTINUA := ´FALSE´;
    V_ERRCODE  := ´INVALID_NUMBER´;
    INSERT INTO IMP_HOSP_ERR
      (IHE_TIPO, IHE_USUARIO, IHE_NRDOC, IHE_DESC, IHE_DTIMPORT, IHE_NRLOTE, IHE_DESCTEC, IHE_CDPRESTADOR)
    VALUES
      (´VE´,
       P_USUARIO,
       P_NRDOC,
       ´VGS05 - Guia n?o importada, existem dados invalidos. ´ || V_CDSERIE_GUIA || V_NRGUIA,
       SYSDATE,
       P_NRLOTE,
       ´´,
       P_CDPRESTADOR);
  END;

  WHEN NO_DATA_FOUND THEN
  BEGIN
    SELECT CDSERIE_GUIA, CDTIPO_GUIA, NRGUIA, TXSENHA_AUTORIZ, CDSITUACAO_GUIA
    INTO V_CDSERIE_GUIA, V_CDTIPO_GUIA, V_NRGUIA, V_TXSENHA_AUTORIZ, V_CDSITUACAO_GUIA
    FROM EMISSAO_GUIA
    WHERE TXSENHA_AUTORIZ = P_SENHA
      AND NRAREA_ACAO = SUBSTR(P_NUMPAC, 1, 3) AND NRCONTRATO = SUBSTR(P_NUMPAC, 4, 4)
      AND NRFAMILIA = SUBSTR(P_NUMPAC, 8, 6)   AND TPUSUARIO = SUBSTR(P_NUMPAC, 14, 2)
      AND NRDIGITO = SUBSTR(P_NUMPAC, 16, 1)
      AND (CDPRESTADOR IS NULL OR CDPRESTADOR = P_CDPRESTADOR);

    IF V_CDSITUACAO_GUIA = 0 THEN
    BEGIN
      V_CDSERIE       := V_CDSERIE_GUIA;
      V_NUMGUIA       := V_NRGUIA;
      V_CONTINUA      := ´TRUE´;
      V_ONDEACHOUGUIA := ´E´;
      RETURN;
    END;
    ELSE
    BEGIN
      V_CONTINUA := ´TRUE´;
      IF V_CDSITUACAO_GUIA = 2 THEN
      BEGIN
        SMSG := ´VGS06 - Guia cancelada.´;
        INSERT INTO IMP_HOSP_ERR
          (IHE_TIPO, IHE_USUARIO, IHE_NRDOC, IHE_DESC, IHE_DTIMPORT, IHE_NRLOTE, IHE_DESCTEC, IHE_CDPRESTADOR)
        VALUES
          (´VE´,
           P_USUARIO,
           P_NRDOC,
           SMSG || ´ ´ || V_CDSERIE_GUIA || V_NRGUIA,
           SYSDATE,
           P_NRLOTE,
           ´´,
           P_CDPRESTADOR);
         RETURN;
      END;
      END IF;
    END;
    END IF;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      V_CONTINUA := ´FALSE´;
  END;
END;
/


já fiz as seguinte verificações:
- rodando em uma máquina somente com o client do Oracle 9i.... não funciona....
- rodando em uma máquina somente com o client do Oracle 10g.... não funciona....
- alterando versões da dbexpora.dll (dbexpress para Oracle) na mesma máquina.... não funciona....
- rodar em outras máquinas, mudando versões de client do Oracle e do dbexpora.dll.... não funciona....
- remover o componente storedproc do projeto do Delphi e adicioná-lo novamente, forçando pegar os parâmetros de input/output.... não funciona....
- passar os parâmetros fixos pelos Delphi (somente para teste, ex: ´2840022000001001´, ´2´, etc).... não funciona....
- compilar o programa no Delphi 7, ao invés do Delphi 6.... não funciona....

conclusões:
- o problema provavelmente não está no executável, pois o mesmo exe roda se estiver na base do 9i....
- também não está no banco (procedure), pois a mesma roda normalmente de outro programa, como no PL/SQL....

desde já, agradeço pela atenção, pois já não sei mais o que tentar....

obrigado....

rodrigo zanfa....


Responder