 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
leogazio Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007 Mensagens: 1047 Localização: Alto Paraná - PR
|
Enviada: Ter Nov 22, 2011 8:26 pm Assunto: Chamar DLL Delphi no Oracle. [RESOLVIDO] |
|
|
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 |
|
 |
leogazio Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007 Mensagens: 1047 Localização: Alto Paraná - PR
|
Enviada: Ter Nov 22, 2011 9:47 pm Assunto: |
|
|
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 |
|
 |
leogazio Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007 Mensagens: 1047 Localização: Alto Paraná - PR
|
Enviada: Ter Nov 22, 2011 10:10 pm Assunto: |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Nov 23, 2011 12:15 am Assunto: |
|
|
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 |
|
 |
leogazio Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007 Mensagens: 1047 Localização: Alto Paraná - PR
|
Enviada: Qua Nov 23, 2011 7:45 am Assunto: |
|
|
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 |
|
 |
leogazio Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007 Mensagens: 1047 Localização: Alto Paraná - PR
|
Enviada: Qua Nov 23, 2011 1:17 pm Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|