StoredProc usando dbExpress e Oracle
16/05/2008
0
[quote:48de663024=´Moderação´][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][/quote: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:
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:
e aqui os códigos da procedure do Oracle:
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....
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][/quote: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....
Rodrigo.zanferrari
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)