Web SERVICE AJUDA

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
gomesd
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 16 Dez 2009 10:12 pm
Localização: Lisboa

Bom dia
Bem eu precisava da ajuda então é assim eu tenho 1 webservice em asp.net em que devolve um cadeia de dados neste caso um dataset.

o exemplo do web service em PL SQL já tenho
Este:

Selecionar tudo

CREATE OR REPLACE FUNCTION get_city_from_zipcode (p_zipcode  IN  VARCHAR2) 
  RETURN VARCHAR2 
AS 
  l_request   soap_api.t_request; 
  l_response  soap_api.t_response; 
  l_return    VARCHAR2(32767); 
  
  l_url          VARCHAR2(32767); 
  l_namespace    VARCHAR2(32767); 
  l_method       VARCHAR2(32767); 
  l_soap_action  VARCHAR2(32767); 
  l_result_name  VARCHAR2(32767); 
BEGIN 
  -- Set proxy details if no direct net connection. 
  --UTL_HTTP.set_proxy('myproxy:4480', NULL); 
  --UTL_HTTP.set_persistent_conn_support(TRUE); 

  -- Set proxy authentication if necessary. 
  --soap_api.set_proxy_authentication(p_username => 'myusername', 
  --                                  p_password => 'mypassword'); 

  l_url         := 'http://webservices.imacination.com/distance/Distance.jws'; 
  l_namespace   := 'xmlns="' || l_url || '"'; 
  l_method      := 'getCity'; 
  l_soap_action := l_url || '#getCity'; 
  l_result_name := 'getCityReturn'; 
  
  l_request := soap_api.new_request(p_method       => l_method, 
                                    p_namespace    => l_namespace); 

  soap_api.add_parameter(p_request => l_request, 
                         p_name    => 'zip', 
                         p_type    => 'xsd:string', 
                         p_value   => p_zipcode); 

  l_response := soap_api.invoke(p_request => l_request, 
                                p_url     => l_url, 
                                p_action  => l_soap_action); 

  l_return := soap_api.get_return_value(p_response  => l_response, 
                                        p_name      => l_result_name, 
                                        p_namespace => l_namespace); 

  RETURN l_return; 
END; 


Até eu consigo perceber mas tenho 2 duvidas pelas quain não tenho nehum know How para fazer

Tipo ok se for so um parametro e como mostra o exemplo e agora se for uma funçlao do asp.net que retorne um dataset que tipo de função no PLSQL tem de ser e como posso mostra essa informação no Forms.
Obrigado e espero que me ajudem.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Cara, tenta usar o tipo de dados ANYDATA,

retorno sys.ANYDATA;

Uma vez quando fiz webservice pelo oracle, usei o JDeveloper e o como container OC4J, aí tinham campos complex-type, que acredito ser o seu caso,

Em ASP.net não sei como funciona...
gomesd
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 16 Dez 2009 10:12 pm
Localização: Lisboa

Obrigado pela resposta posso fazer isso sempre mas na função certo?
O meu problema é também como faço no Forms uma gridView a dizer que vai ser preenchida pela função da minha package.
Cumprimentos.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Pelo que eu entendi o retorno da sua funcao é um tipo de dados complexo certo?

então a variavel de retorno tenta sendo ANYDATA, sinceramente não sei se vai funcionar,

quanto ao grid você pode fazer a sua package preencher uma tabela temporaria e depois no bloco no Forms você associa essa tabela como sendo a fonte de dados, pode retornar um vetor, etc,

se você expor a situação, cenário, serviços que estão rodando aí, talvez possamos sugerir outro caminho, outras idéias,

qualquer coisa posta aí,
gomesd
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 16 Dez 2009 10:12 pm
Localização: Lisboa

então é assim tenho uma BD em sql SERVER e tenho de ir la buscar informação atraves de um WebService em asp.net consigo ir la e preencher o DataSet agora Os desafios são por aquilo no PL SQL e no forms pelo que li ate agora foi posso consumir o web service na package ate aqui ok e entendi uma parte depois como Mostrar a minha informação no Oracle forms atraves da package da função que requesita o web service. Tenho mesmo que criar uma tabela temporaria ?? Estranho Porque se um webservice me devolve um objecto tambem me devia permitir passar o mesmo nem que fosse um array?.
Cumprimentos,
DG
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Os servidores estão na mesma rede? Se conversam? de repente seja muitos mais simples você utilizar DBLINK, heterogeneos,

http://www.dba-oracle.com/t_database_li ... oracle.htm

dessa forma é muito mais fácil, acredito eu, além de ser mais flexivel, quando quiser acessar outra tabela do SQLSERVER vai fazer outro WebService?

Pode escrever uma java stored procedure que acessa o sql server via JDBC, enfim, existem outras saídas,

é necessário exclusivamente que seja utilizado webservices?

A idéia da tabela temporária facilitaria o tratamento no forms, pois você somente precisaria colocar ela como sendo a fonte de dados do Bloco, já retornando um objeto, você teria que fazer loops para carregar os valores no bloco, etc,

espero ter ajudado
gomesd
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 16 Dez 2009 10:12 pm
Localização: Lisboa

Sim estao na mesma rede mas acontece
Que tenho um range de 1 a 35 e o webservice esta de maneira inteligente e já sabe a qula me quero ligar so que na opçao que deste e assim oracle em linux sql no windows.
então não é assim tão linear como dizes.
Será que nuncqa ninguém precisou fazer algo parecido?
Cumprimentos,
DG
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

gomesd
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 16 Dez 2009 10:12 pm
Localização: Lisboa

Pois assim deve dar mas mesmo assim
Eu não posso mexer nos aplicacionais sendo assim so posso mesmo utilizar pl sql , forms e asp.net webservice.
Eu acredito que desta forma não acredito que seja facil mas tem de tentar se conseguir devolver pelo menos um unico item
já é um passo
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

gomesd
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 16 Dez 2009 10:12 pm
Localização: Lisboa

Viva Mais ou menos o problema não esta no webservice esta em passar todos os dados
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Selecionar tudo

soap_api.add_parameter(p_request => l_request,
                         p_name    => 'zip',
                         p_type    => 'xsd:string',
                         p_value   => p_zipcode); 

soap_api.add_parameter(p_request => l_request,
                         p_name    => 'parametro2',
                         p_type    => 'xsd:string',
                         p_value   => p_valor2); 

soap_api.add_parameter(p_request => l_request,
                         p_name    => 'parametro3',
                         p_type    => 'xsd:string',
                         p_value   => p_valor3); 
isso não funciona?
gomesd
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 16 Dez 2009 10:12 pm
Localização: Lisboa

Selecionar tudo

CREATE OR REPLACE FUNCTION SRDS.get_joke RETURN VARCHAR2 AS

  service_           SRDS_DBWS.utl_dbws.SERVICE;
  call_              SRDS_DBWS.utl_dbws.CALL;
  service_qname      SRDS_DBWS.utl_dbws.QNAME;
  port_qname         SRDS_DBWS.utl_dbws.QNAME;
  xoperation_qname   SRDS_DBWS.utl_dbws.QNAME;
  xstring_type_qname SRDS_DBWS.utl_dbws.QNAME;
  response           sys.XMLTYPE;
  request            sys.XMLTYPE;

BEGIN

  --SRDS_DBWS.utl_dbws.set_http_proxy('10.51.250.224:8080');

  service_qname := SRDS_DBWS.utl_dbws.to_qname(null, 'getCity');
  service_      := SRDS_DBWS.utl_dbws.create_service(service_qname);
  call_         := SRDS_DBWS.utl_dbws.create_call(service_);
  SRDS_DBWS.utl_dbws.set_target_endpoint_address(call_, 'http://10.51.250.209/WSD/Service1.asmx');


  SRDS_DBWS.utl_dbws.set_property(call_, 'SOAPACTION_USE', 'TRUE');
  SRDS_DBWS.utl_dbws.set_property(call_, 'SOAPACTION_URI', 'http://schemas.xmlsoap.org/soap/encoding/');
  SRDS_DBWS.utl_dbws.set_property(call_, 'OPERATION_STYLE','document');

 request := sys.XMLTYPE('<getCity xmlns="http://10.51.250.209/WSD/"><Category>Excuses-10</Category> </getCity>');

  response :=SRDS_DBWS.utl_dbws.invoke(call_, request);

  return response.extract('//getJokeResult/child::text()', 'xmlns="http://10.51.250.209/WSD/"').getstringval();
END;

/
Isto esta me a dar erro nersta linha não sei o que e isto?? alguém Please
gomesd
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 16 Dez 2009 10:12 pm
Localização: Lisboa

Desculpem nesta linha

Selecionar tudo

  SRDS_DBWS.utl_dbws.set_property(call_, 'SOAPACTION_URI', 'http://schemas.xmlsoap.org/soap/encoding/');

Selecionar tudo

Erro :ORA-29532: a chamada de Java foi terminada por uma excepc?o de Java inesperada: javax.xml.rpc.soap.SOAPFaultException: Server did not recognize the value of HTTP Header SOAPAction: http://schemas.xmlsoap.org/soap/encoding/.
ORA-06512: na "SRDS_DBWS.UTL_DBWS", linha 404
ORA-06512: na "SRDS_DBWS.UTL_DBWS", linha 401
Vi este Topico mas depois diz que não pode devolver a nulo
http://beautifulwaste.blogspot.com/2007 ... -from.html

Please anyone
gomesd
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 16 Dez 2009 10:12 pm
Localização: Lisboa

Boa Noite em Pleno
O problema esta corrigido apesar de uma pequena parte mas
Mesmo assim devolvo uma string agora um array e complicado pk pela estrutura no PL SQL temos de incluir o element Result do xml.
Quem quiser o codigo me contacte d_gomes2@hotmail.com.
Cumprimentos DG
gomesd
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 16 Dez 2009 10:12 pm
Localização: Lisboa

Viva
Sim pode ser vê este exemplo serve perfeitamente envia parametro e recebe

Selecionar tudo

CREATE OR REPLACE FUNCTION SRDS.get_joke RETURN VARCHAR2 AS

 

  service_           SRDS_DBWS.utl_dbws.SERVICE;

  call_              SRDS_DBWS.utl_dbws.CALL;

  service_qname      SRDS_DBWS.utl_dbws.QNAME;

  port_qname         SRDS_DBWS.utl_dbws.QNAME;

  xoperation_qname   SRDS_DBWS.utl_dbws.QNAME;

  xstring_type_qname SRDS_DBWS.utl_dbws.QNAME;

  response           sys.XMLTYPE;

  request            sys.XMLTYPE;

 

BEGIN

  --SRDS_DBWS.utl_dbws.set_http_proxy('IP:8080');
 

  service_qname := SRDS_DBWS.utl_dbws.to_qname(null, 'getCity');

  service_      := SRDS_DBWS.utl_dbws.create_service(service_qname);

  call_         := SRDS_DBWS.utl_dbws.create_call(service_);

  SRDS_DBWS.utl_dbws.set_target_endpoint_address(call_, 'http://IP/WSD/Service1.asmx?WSDL');

 

  SRDS_DBWS.utl_dbws.set_property(call_, 'SOAPACTION_USE', 'TRUE');

  SRDS_DBWS.utl_dbws.set_property(call_, 'SOAPACTION_URI', 'http://tempuri.org/getCity');

  SRDS_DBWS.utl_dbws.set_property(call_, 'OPERATION_STYLE','document');
  
   --<Category>Excuses-10</Category>

 request := sys.XMLTYPE('<getCity xmlns="http://tempuri.org/getCity"><getCityResult>Excuses-10</getCityResult> </getCity>');

 

  response :=SRDS_DBWS.utl_dbws.invoke(call_, request);

  return response.extract('//getCityResult/child::text()', 'xmlns="http://tempuri.org/"').getstringval();
            

END;

/

Parte final para consultares

Selecionar tudo

SELECT srds.get_joke FROM DUAL;

funçao de webservice

Selecionar tudo

<WebMethod()> _
    Public Function getCity() As String
        Dim plu As String = "VAZIO"
        Dim My_obj As New PLU_ID.Class_PLU
        '4650
        My_obj.Artigo = Get_PLU(4650).Artigo
        plu = My_obj.Artigo.ToString

        Return plu
    End Function
mas podes sempre por os parametros de IN é a unica alteração precisa no PL/SQl retornar já ele retorna.
OBS: Está testado e funciona.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 19 visitantes