ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Chamar DLL Delphi no Oracle. [RESOLVIDO]

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
leogazio
Colaborador
Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007
Mensagens: 1047
Localização: Alto Paraná - PR

MensagemEnviada: Ter Nov 22, 2011 8:26 pm    Assunto: Chamar DLL Delphi no Oracle. [RESOLVIDO] Responder com Citação

Fala povo! SegUinte; Como fazer pra chamar uma DLL simples criada no Delphi por dentro do Oracle 10g? Já fiz de um monte aqui e nada tá funcionando, segue os passos que eu executei aqui;

A DLL no Delphi;

Código:
library ERProBDLib;

uses
  SysUtils, DateUtils, Classes;

function proximaDataPeloDia(DataIni: TDateTime; Dia: integer): TDateTime;
  var DataAux : TDateTime;
      DiaAux  : word;
      MesAux  : word;
      AnoAux  : word;
begin
  DataAux := DataIni + 1;
  DecodeDate(DataAux, AnoAux, MesAux, DiaAux);
  if DiaAux = Dia then
      Result := DataAux
  else
      if DiaAux < Dia then
          if TryEncodeDate(AnoAux, MesAux, Dia, DataAux) then
              Result := DataAux
          else
              Result := Trunc(EndOfAMonth(AnoAux, MesAux))
      else
      begin
          DiaAux := Dia;
          IncAMonth(AnoAux, MesAux, DiaAux, 1);
          Result := EncodeDate(AnoAux, MesAux, DiaAux);
      end;
end;

exports proximaDataPeloDia;

begin
end.


1- Coloquei a DLL dentro da pasta LIB da instalação do Oracle;
C:\oraclexe\app\oracle\product\10.2.0\server\LIB\ERProBDLib.dll

2- Criada a library no banco e dados os privilégios para o schema;

Código:
CREATE OR REPLACE LIBRARY ERPROBDLIB AS 'C:\oraclexe\app\oracle\product\10.2.0\server\LIB\ERProBDLib.dll';
GRANT ALL PRIVILEGES ON ERPROBDLIB TO PUBLIC;
/


3- Criada a function que deveria chamar essa DLL;

Código:
CREATE OR REPLACE FUNCTION PROXIMADATAPELODIA(DATAINI IN DATE, DIA IN INTEGER) RETURN DATE
IS
EXTERNAL LIBRARY ERPROBDLIB NAME "proximaDataPeloDia" LANGUAGE C;
/


Só que quando eu tento chamar a função normal, assim;

Código:
SELECT PROXIMADATAPELODIA(TRUNC(SYSDATE), 30) AS TESTE FROM DUAL;


Não funciona e me retorna sempre a seguinte mensagem de erro;
ORA-28595: Agente extproc: Caminho de DLL Inválido.

Vi um tópico aqui dizendo que até a versão 10g o Oracle só consegue fazer chamadas em DLLs que estejam dentro da pasta "BIN" ou na pasta "LIB" da ORACLE_HOME, mas fiz a modificação do caminho da DLL e não adiantou. Por que será?
_________________
Leonardo Gazio - Consultoria e Suporte a Desenvolvedores.

Suporte para todo o Brasil via;
E-mail: leonardogazio@delphimasters.com
Msn: lngsmattos@hotmail.com
Claro: (21) 7301-7243


Editado pela última vez por leogazio em Qua Nov 23, 2011 1:18 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leogazio
Colaborador
Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007
Mensagens: 1047
Localização: Alto Paraná - PR

MensagemEnviada: Ter Nov 22, 2011 9:47 pm    Assunto: Responder com Citação

Galera se alguém puder me ajudar ou tiver alguma luz, por favor compartilhem, eu preciso entregar essa rotina funcionando até quinta-feira de manhã, qualquer ajuda é sempre bemvinda.
_________________
Leonardo Gazio - Consultoria e Suporte a Desenvolvedores.

Suporte para todo o Brasil via;
E-mail: leonardogazio@delphimasters.com
Msn: lngsmattos@hotmail.com
Claro: (21) 7301-7243
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leogazio
Colaborador
Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007
Mensagens: 1047
Localização: Alto Paraná - PR

MensagemEnviada: Ter Nov 22, 2011 10:10 pm    Assunto: Responder com Citação

Pessoal eu criei uma outra DLL com uma funlção simples com vários tipos no retorno só pra testar a chamada por dentro do Oracle, integer, string, widestring, pchar, char, etc... Chamei elas em outras linguagens, C#, Java, no próprio Delphi e funcionou na boa em todas. Mas nenhuma delas funcionou no Oracle, eu tô começando a suspeitar que o Oracle NÃO chama DLL feita no Delphi(embora eu acho que não deveria ter nada a ver) pois no CREATE FUNCTION, o function que vai chamar a DLL, só aceita LANGUAGE C, ou seja, se alguém puder me ajudar a criar essa DLL no C e realmente esse for o meu problema eu agradeço até morrer;

Código:
library ERProBDLib;

uses
  SysUtils, DateUtils, Classes;

function proximaDataPeloDia(DataIni: TDateTime; Dia: integer): TDateTime;
  var DataAux : TDateTime;
      DiaAux  : word;
      MesAux  : word;
      AnoAux  : word;
begin
  DataAux := DataIni + 1;
  DecodeDate(DataAux, AnoAux, MesAux, DiaAux);
  if DiaAux = Dia then
      Result := DataAux
  else
      if DiaAux < Dia then
          if TryEncodeDate(AnoAux, MesAux, Dia, DataAux) then
              Result := DataAux
          else
              Result := Trunc(EndOfAMonth(AnoAux, MesAux))
      else
      begin
          DiaAux := Dia;
          IncAMonth(AnoAux, MesAux, DiaAux, 1);
          Result := EncodeDate(AnoAux, MesAux, DiaAux);
      end;
end;

exports proximaDataPeloDia;

begin
end.


Um abraço à todos os sofredores solidários...
_________________
Leonardo Gazio - Consultoria e Suporte a Desenvolvedores.

Suporte para todo o Brasil via;
E-mail: leonardogazio@delphimasters.com
Msn: lngsmattos@hotmail.com
Claro: (21) 7301-7243
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Nov 23, 2011 12:15 am    Assunto: Responder com Citação

Não tenho experiência nenhuma com Oracle, mas vendo os 2 links abaixo

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm
http://psoug.org/reference/date_func.html

fiz algumas mudanças no código em delphi

Código:
function TForm1.ProximaDataPeloDia(Data: TDateTime;
                                   Dia: integer): TDateTime;
var
  DataAux: TDateTime;
  Mes: integer;
begin
DataAux := Data + 1;
if DayOf(DataAux) = Dia then
    Result := DataAux
else
    begin
    if DayOf(DataAux) > Dia then
        DataAux := Trunc(EndOfTheMonth(DataAux)) + 1;
    Mes := MonthOf(DataAux);
    while (DayOf(DataAux) < Dia) and
          (MonthOf(DataAux) = Mes) do
        DataAux := DataAux + 1;
    if DayOf(DataAux) = Dia then
        Result := DataAux
    else
        Result := DataAux - 1;
    end;
end;


para depois tentar passar para o Oracle

Código:
CREATE OR REPLACE FUNCTION ProximaDataPeloDia (Data DATE,
  Dia NUMBER) RETURN DATE IS
  DataAux DATE := Data + 1;
  Mes NUMBER := 0;
BEGIN
  IF EXTRACT(Day FROM DataAux) = Dia THEN
      RETURN DataAux;
  ELSE
      IF EXTRACT(Day FROM DataAux) > Dia THEN
          DataAux := LAST_DAY(DataAux) + 1;
      END IF;
      Mes := EXTRACT(Month FROM DataAux);
      WHILE (EXTRACT(Day FROM DataAux) < Dia) AND
            (EXTRACT(Month FROM DataAux) = Mes)
          LOOP
              DataAux := DataAux + 1;
          END LOOP;
      IF EXTRACT(Day FROM DataAux) = Dia THEN
          RETURN DataAux;
      ELSE
          RETURN DataAux - 1;
      END IF;
  END IF;
END ProximaDataPeloDia;
/


Não sei se isso vai funcionar.
Acho que a lógica do código ficou pior em relação a outra função.
E não testei muito essa lógica.

Espero que seja útil.


Editado pela última vez por imex em Qua Out 18, 2023 11:12 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leogazio
Colaborador
Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007
Mensagens: 1047
Localização: Alto Paraná - PR

MensagemEnviada: Qua Nov 23, 2011 7:45 am    Assunto: Responder com Citação

Porra cara eu procurei muito meu um modo de montar essa função dentro do PL mas não consegui e também é aquele negócio, um trozilhão de coisa pra fazer fora essa rotina, aí acabei empurrando com a barriga, mas acabei tendo que voltar nela pra uma outra situação. Eu consegui chamar a DLL, era uma coisa babaca que tava faltando, assim que baixar a poeira aqui eu vou postar a solução pra quem um dia for precisar, mas quanto à sua função eu vou testar e se funcionar vou tirar essa DLL que começa a prender o meu banco no Windows, coisa que eu não quero mesmo...

Valeu, grande abraço!
_________________
Leonardo Gazio - Consultoria e Suporte a Desenvolvedores.

Suporte para todo o Brasil via;
E-mail: leonardogazio@delphimasters.com
Msn: lngsmattos@hotmail.com
Claro: (21) 7301-7243
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leogazio
Colaborador
Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007
Mensagens: 1047
Localização: Alto Paraná - PR

MensagemEnviada: Qua Nov 23, 2011 1:17 pm    Assunto: Responder com Citação

Pô aí meu irmão! Funcionou batata a sua função, tirei as trepadeiras de DLL tudo lá do banco.

Um abraço!
_________________
Leonardo Gazio - Consultoria e Suporte a Desenvolvedores.

Suporte para todo o Brasil via;
E-mail: leonardogazio@delphimasters.com
Msn: lngsmattos@hotmail.com
Claro: (21) 7301-7243
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB