Re: [oracle_br] Re: Chamada de external procedure

2006-04-06 Por tôpico Mauricio Françoso
Muito obrigado Chiappa.

jlchiappa [EMAIL PROTECTED] escreveu:  Bem, não  sou especialista em DLLs, só 
as usei um pouco pra chamar
APIs prontas, , mas uma coisa que normalmente vejo é o tipo integer
ser mapeado nos arqs da função como BINARY_INTEGER, e não como
PL_INTEGER. A declaração em si da DLl numa passada superficial me
parece correta...
O que eu te sugiro é : ** antes de tudo **, siga o setup recomendado
no manual citado (na SUA versão de banco!), pra testar faça uma
external chamando uma dll ** do sistema operacional **, por exemplo
como mostrado em
http://asktom.oracle.com/pls/ask/f?p=4950:8:F4950_P8_DISPLAYID:21419917814146
e em
http://asktom.oracle.com/pls/ask/f?p=4950:8:F4950_P8_DISPLAYID:2450510349959
(pois aí se vc tiver problemas outras pessoas da lista podem tentar
reproduzir), e só então, com ambiente testado e ok, aí sim vá tentar
chamar essa dll , que pelo que vejo é específica dum fornecedor...
  Em
http://asktom.oracle.com/pls/ask/f?p=4950:8:F4950_P8_DISPLAYID:9087161189226
,
http://asktom.oracle.com/pls/ask/f?p=4950:8:F4950_P8_DISPLAYID:934029542973
e
http://asktom.oracle.com/pls/ask/f?p=4950:8:F4950_P8_DISPLAYID:1200435685237
há exemplos chamando DLLs com cabeçalho padrão linguagem C e afora a
questão dos datatypes são basicamente idênticas ao que vc mostrou.

[]s

Chiappa  

--- Em oracle_br@yahoogrupos.com.br, Mauricio Françoso
[EMAIL PROTECTED] escreveu

 Chiappa,

   Este é o metodo na DLL: (Prototipo da Funcao)

   extern C __declspec(dllexport) int __stdcall
ExecInClientDLL(intID, const char * Parameters, char * Buffer, int Size)

   ---

   Minha duvida é: Para chamar a funcao acima os datatypes da Proc
estao corretos ? Da uma olhada abaixo:

CREATE OR REPLACE PROCEDURE LDAPlps (
 IN_ID  IN  PLS_INTEGER, 
 IN_PARAM   IN  VARCHAR2,
 OUT_BUFFER OUT VARCHAR2,
 IN_SIZE  IN  PLS_INTEGER) 
  AS LANGUAGE C
 LIBRARY ldap_microsiga
 NAME ExecInClientDLL
 PARAMETERS (
IN_ID INT , 
IN_PARAM   STRING, 
OUT_BUFFER BY REFERENCE STRING, 
IN_SIZEINT);
 
 
   []s


   Mauricio


   
 jlchiappa [EMAIL PROTECTED] escreveu:
   No banco 8i vc está tentando seguir as instruções do 10g, não é meio 
 estranho isso, deveria ser o manual Oracle8i Application Developer's 
 Guide - Fundamentals, cap. 10 - External Routines, online em 
 http://www.oracle.com/technology/documentation/oracle8i.html.
 Nesse cara é especificado que vc tem que fazer alterações no 
 listener, vc as fez ? parou e subiu o listener de novo após isso ? 
 sqlnet não é listado, afaik, no documento como sendo necessário 
 altera (a ref é 1. Set Up the Environment
 Your DBA sets up the environment for calling external routines by 
 adding entries to the files tnsname.ora and listener.ora and by 
 starting a Listener process exclusively for external routines. 
 
 , exatamente O QUE vc alterou nele ??
 
 []s
 
 Chiappa
 --- Em oracle_br@yahoogrupos.com.br, mfrancoso [EMAIL PROTECTED] 
 escreveu
 
  SO = windows 2000
  ORACLE 8.1.7.4.0
  
  Pessoal,
  
  Estou tentando executar uma external procedure mas não estou 
 obtendo 
  exito:
  
  Seguem os passos executado.
  
  Esse é o link dos datatypes
  http://www.oracle-
  
 10g.de/oracle_10g_documentation/appdev.101/b10795/adfns_ex.htm#1021379
  
   
   PARAMETROS DO METODO NA DLL 
  
  extern C __declspec(dllexport) int __stdcall ExecInClientDLL(int 
  ID, const char * Parameters, char * Buffer, int Size)
   
  
   CRIACAO DA LIBRARY PARA A EXTERNAL PROCEDURE 
  
  
  CREATE OR REPLACE LIBRARY ldap_microsiga
  AS 'C:\Component_dlls\LDAP\DllProtheus.dll';
  
  
   CRIACAO DA STORED PROCEDURE MAPEANDO PARA A FUNCAO NA DLL
  
  CREATE OR REPLACE PROCEDURE LDAPlps (
 IN_ID  IN  PLS_INTEGER, 
 IN_PARAM   IN  VARCHAR2,
 OUT_BUFFER OUT VARCHAR2,
 IN_SIZE  IN  PLS_INTEGER) 
  AS LANGUAGE C
 LIBRARY ldap_microsiga
 NAME ExecInClientDLL
 PARAMETERS (
IN_ID INT , 
IN_PARAM   STRING, 
OUT_BUFFER BY REFERENCE STRING, 
IN_SIZEINT);
  
  
   SCRIPT CHAMANDO NO SQL*PLUS 
  
  DECLARE
 v_IN_IDPLS_INTEGER:=1; 
 v_IN_PARAM VARCHAR2(100):='mic1|-|[EMAIL PROTECTED]|-|MICROSIGA|-
  |C:\Component_dlls\LDAP\MICROSIGA|-|[EMAIL PROTECTED]';
 v_OUT_BUFFER VARCHAR2(100);
 v_IN_SIZEPLS_INTEGER:=50;
   
  BEGIN
   
  
 LDAPlps(v_IN_ID, v_IN_PARAM, v_OUT_BUFFER, v_IN_SIZE);
 DBMS_OUTPUT.PUT_LINE('free disk space, megabytes = ' || 
  v_OUT_BUFFER);
  
  END;
  
   
  
   
  Chamando a DLL por um EXE dá ok.
  Chamando pelo Oracle dá o erro abaixo:
  
  ORA-28576: lost RPC connection to external procedure agent
  
  O tnsnames ,sqlnet e o listener já foram configurados e estão ok
  mas continuo recebendo o erro acima.
  
  
  obrigado.
 
 
 
 
 
 
 
 


[oracle_br] Re: Chamada de external procedure

2006-04-05 Por tôpico jlchiappa
No banco 8i vc está tentando seguir as instruções do 10g, não é meio 
estranho isso, deveria ser o manual Oracle8i Application Developer's 
Guide - Fundamentals, cap. 10 - External Routines, online em 
http://www.oracle.com/technology/documentation/oracle8i.html.
 Nesse cara é especificado que vc tem que fazer alterações no 
listener, vc as fez ? parou e subiu o listener de novo após isso ? 
sqlnet não é listado, afaik, no documento como sendo necessário 
altera (a ref é 1. Set Up the Environment
Your DBA sets up the environment for calling external routines by 
adding entries to the files tnsname.ora and listener.ora and by 
starting a Listener process exclusively for external routines. 

, exatamente O QUE vc alterou nele ??

[]s

 Chiappa
--- Em oracle_br@yahoogrupos.com.br, mfrancoso [EMAIL PROTECTED] 
escreveu

 SO = windows 2000
 ORACLE 8.1.7.4.0
 
 Pessoal,
 
 Estou tentando executar uma external procedure mas não estou 
obtendo 
 exito:
 
 Seguem os passos executado.
 
 Esse é o link dos datatypes
 http://www.oracle-
 
10g.de/oracle_10g_documentation/appdev.101/b10795/adfns_ex.htm#1021379
 
  
  PARAMETROS DO METODO NA DLL 
 
 extern C __declspec(dllexport) int __stdcall ExecInClientDLL(int 
 ID, const char * Parameters, char * Buffer, int Size)
  
 
  CRIACAO DA LIBRARY PARA A EXTERNAL PROCEDURE 
 
 
 CREATE OR REPLACE LIBRARY ldap_microsiga
 AS 'C:\Component_dlls\LDAP\DllProtheus.dll';
 
 
  CRIACAO DA STORED PROCEDURE MAPEANDO PARA A FUNCAO NA DLL
 
 CREATE OR REPLACE PROCEDURE LDAPlps (
IN_ID  IN  PLS_INTEGER, 
IN_PARAM   IN  VARCHAR2,
OUT_BUFFER OUT VARCHAR2,
IN_SIZE  IN  PLS_INTEGER) 
 AS LANGUAGE C
LIBRARY ldap_microsiga
NAME ExecInClientDLL
PARAMETERS (
   IN_ID INT , 
   IN_PARAM   STRING, 
   OUT_BUFFER BY REFERENCE STRING, 
   IN_SIZEINT);
 
 
  SCRIPT CHAMANDO NO SQL*PLUS 
 
 DECLARE
v_IN_IDPLS_INTEGER:=1; 
v_IN_PARAM VARCHAR2(100):='mic1|-|[EMAIL PROTECTED]|-|MICROSIGA|-
 |C:\Component_dlls\LDAP\MICROSIGA|-|[EMAIL PROTECTED]';
v_OUT_BUFFER VARCHAR2(100);
v_IN_SIZEPLS_INTEGER:=50;
  
 BEGIN
  
 
LDAPlps(v_IN_ID, v_IN_PARAM, v_OUT_BUFFER, v_IN_SIZE);
DBMS_OUTPUT.PUT_LINE('free disk space, megabytes = ' || 
 v_OUT_BUFFER);
 
 END;
 
  
 
  
 Chamando a DLL por um EXE dá ok.
 Chamando pelo Oracle dá o erro abaixo:
 
 ORA-28576: lost RPC connection to external procedure agent
 
 O tnsnames ,sqlnet e o listener já foram configurados e estão ok
 mas continuo recebendo o erro acima.
 
 
 obrigado.








--
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine 
__
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o 
link do mesmo para evitar trafego(pedidos) desnecessário. 
Links do Yahoo! Grupos

* Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/

* Para sair deste grupo, envie um e-mail para:
[EMAIL PROTECTED]

* O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html