Pular para o conteúdo
Visualizando 10 posts - 1 até 10 (de 10 do total)
  • Autor
    Posts
  • #94372
    Avatar de airoospairoosp
    Participante

      Bom dia,

      Há um webservice que retorna uma lista de valores, alguém sabe como fazer para capturar estes valores e gravar em uma tabela?
      Estou utilizando banco 9i.

      Obrigado.

      Airton

      #94375
      Avatar de fsitjafsitja
      Participante

        Você está recebendo o retorno do web service como um arquivo XML? Se for esse o caso, daria para abrir o XML como um CLOB e ler seu conteúdo usando XMLTYPE via select e dando insert.

        Se você puder postar um exemplo do arquivo, com o conteúdo de uns dados para a gente ver a estrutura do XML e da sua tabela de destino, podemos fazer um código que insira na tabela.

        #94377
        Avatar de airoospairoosp
        Participante

          Boa tarde,

          A tabela que irá receber os registros retornados do Webservice tem a estrutura abaixo:

          table CARTOES_DISPONIVEIS
          (
          ID_REGISTRO NUMBER,
          NUMERO_CARTAO VARCHAR2(10),
          DATA_INCLUSAO DATE
          )

          O WebService retorna o XML conforme descrito abaixo:

                     001972
                     001981
                     001997
                     002000
                     002001
                     002008
                     002013
                     002038
                     002055
                     002056
                     002079
                     002093
                     002104
                     002113
                     002131
                     002132
          
                  OK
                  0
          

          O insert seria o para o campo numero_cartao o que esta entre as tags listaCartoes, ID_registro usando uma sequence ( já criada ) via trigger e data_inclusao o sysdate.

          Agradeço a ajuda.

          Airton

          #94387
          Avatar de fsitjafsitja
          Participante

            Olá Airton,

            Segue uma forma de extrair os dados do XML e inserir na tabela relacional.

            No exemplo abaixo armazenei o CLOB com o XML recebido numa tabela que possui uma coluna XMLTYPE. Você apenas teria que pegar o output do web service e inserir nessa tabela antes de executar a carga.

            Se você preferir atribuir a sequence e o sysdate via trigger tudo bem também, mas no exemplo coloquei tudo no insert.


            Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
            Connected as FSITJA

            SQL>
            SQL> create table xml_cartoes (txt xmltype);

            Table created
            SQL> insert into xml_cartoes values (xmltype (
            2 '
            3
            4
            5 001972
            6 001981
            7 001997
            8 002000
            9 002001
            10 002008
            11 002013
            12 002038
            13 002055
            14 002056
            15 002079
            16 002093
            17 002104
            18 002113
            19 002131
            20 002132
            21
            22 OK
            23 0
            24
            25 '));

            1 row inserted
            SQL> commit;

            Commit complete
            SQL> CREATE TABLE CARTOES_DISPONIVEIS
            2 (ID_REGISTRO NUMBER(20),
            3 NUMERO_CARTAO VARCHAR2(10),
            4 DATA_INCLUSAO DATE);

            Table created
            SQL> CREATE SEQUENCE sq_id_cartao_disp START WITH 1
            2 INCREMENT BY 1
            3 NOCACHE
            4 NOCYCLE;

            Sequence created
            SQL> INSERT INTO cartoes_disponiveis (id_registro, numero_cartao, data_inclusao)
            2 SELECT sq_id_cartao_disp.nextval,
            3 num_cartao,
            4 sysdate
            5 FROM xml_cartoes x,
            6 xmltable(XMLNAMESPACES(DEFAULT 'http://services.mdc.com.br'),
            7 '/listaCartoesVagosResponse/listaCartoesVagosReturn/listaCartoes/listaCartoes'
            8 PASSING x.txt
            9 COLUMNS num_cartao varchar2(10) PATH '/listaCartoes');

            16 rows inserted
            SQL> SELECT * FROM cartoes_disponiveis;

                  ID_REGISTRO NUMERO_CARTAO DATA_INCLUSAO
            

                            1 001972        03/06/2010 18
                            2 001981        03/06/2010 18
                            3 001997        03/06/2010 18
                            4 002000        03/06/2010 18
                            5 002001        03/06/2010 18
                            6 002008        03/06/2010 18
                            7 002013        03/06/2010 18
                            8 002038        03/06/2010 18
                            9 002055        03/06/2010 18
                           10 002056        03/06/2010 18
                           11 002079        03/06/2010 18
                           12 002093        03/06/2010 18
                           13 002104        03/06/2010 18
                           14 002113        03/06/2010 18
                           15 002131        03/06/2010 18
                           16 002132        03/06/2010 18
            

            16 rows selected

            SQL>

            #94388
            Avatar de fsitjafsitja
            Participante

              A propósito, se você quiser verificar o Status e o Msg antes de proceder com a inclusão dos registros na tabela, poderia ser com um select numa procedure ou function que faça a verificação.

              SQL> SELECT msg, status
              2 FROM xml_cartoes x,
              3 xmltable(XMLNAMESPACES(DEFAULT 'http://services.mdc.com.br'),
              4 '/listaCartoesVagosResponse/listaCartoesVagosReturn/msg'
              5 PASSING x.txt
              6 COLUMNS msg varchar2(50) PATH '/msg'),
              7 xmltable(XMLNAMESPACES(DEFAULT 'http://services.mdc.com.br'),
              8 '/listaCartoesVagosResponse/listaCartoesVagosReturn/status'
              9 PASSING x.txt
              10 COLUMNS status varchar2(10) PATH '/status');

              MSG STATUS


              OK 0

              SQL>

              Além disso eu recomendaria ter cuidado com o campo NUMERO_CARTAO pois ele está em VARCHAR2. O ideal seria transformar ele em Number(10), eliminar os zeros à esquerda e evitar problemas com espaços em branco na frente e atrás do número. Se for preciso colocar os zeros à esquerda por requisito do usuário faça apenas no display dos dados, pela interface de usuário, e não no banco de dados onde eles são armazenados.

              #94421
              Avatar de airoospairoosp
              Participante

                Bom dia,

                Vou testar os códigos que você possou, acontece que a package SOAP_API que estou utilizando para retornar informações do WebService retorna apenas valor isolado e não uma lista.
                Fiz um teste com a package SOAP_API que encontrei na Internet
                (http://www.oracle-base.com/dba/miscellaneous/soap_api)
                e vi que o erro esta na function generate_envelope pois foi onde o Oracle parou a execução.

                Como você utiliza WebService, é através de package?

                Obrigado.

                Airton

                #94443
                Avatar de fsitjafsitja
                Participante

                  Bom, já entrando no ramo do palpite, acho que você vai ter que debugar mesmo essa package. Ela não é fornecida pela Oracle, apenas serve de wrapper para a UTL_HTTP, e é lá que está o mistério. Pode ser que essa package não te atenda e tenha que customizá-la.

                  De repente ajudaria verificar como ele está montando o envelope e testar num software de web service comum tipo SOAP UI e se a coisa encrespar, após resolver essa questão com o envelope, usar um trace de TCP.

                  http://www.eviware.com/soapUI/soapui-pr … rview.html
                  http://www.pocketsoap.com/tcptrace/

                  #94481
                  Avatar de airoospairoosp
                  Participante

                    Boa tarde,

                    A package SOAP_API esta funcionando só que o retorno do WebService referente à lista de cartões é em apenas um campo conforme linha abaixo:

                    select lista_cartoes_ws(‘acesso’,’http://services/UsuariosCartoes?wsdl’,’714′) as retorno
                    from dual;

                    O conteúdo de retorno é:

                    0019720019810019970020000020010020080020130020380020550020560
                    0207900209300210400211300213100213200213300213400213500213600
                    2137002138002139002140002141002142002143002144002145002146002
                    1470021480021490021500021510021520021530021540021550021560021
                    5700215800215900216000216100216200216300216400216500216600216
                    7002168002169002170002171002172002173002174002175002176002177
                    0021780021790021800021810021820021830021840021850021860021870
                    0218800218900219000219100219200219300219400219500219600219700
                    2198002199002200002201002202002203002204002205002206002207002
                    2080022090022100022110022120022130022140022150022160022170022
                    1800221900222000222100222200222300222400222500222600222700222
                    8002229002230002231002232002233002234002235002236002237002238
                    0022390022400022410022420022430022440022450022460022470022480
                    02249002250002251099955

                    Ainda não consegui entender como trabalhar quando o retorno for XML,
                    pois no insert que você passou nas mensagens anteriores faz a inclusão da estrutura XML na tabela. O detalhe é como capturar o retorno XML.

                    Obrigado.

                    Airton

                    #94485
                    Avatar de fsitjafsitja
                    Participante

                      Pelo que vi sobre essa package soap_api que o camarada criou, ela faz um extract dos valores do xml.

                      Você poderia postar o código da função lista_cartoes_ws? E da soap_api, se você fez algum modificação na package?

                      #94489
                      Avatar de airoospairoosp
                      Participante

                        Boa tarde,

                        Na package Soap_api não fiz alteração, segue abaixo a function.

                        create or replace function lista_cartoes_ws
                        (
                        proxy_server IN VARCHAR2,
                        web_service IN VARCHAR2,
                        web_service_param IN VARCHAR2
                        )

                        RETURN VARCHAR2

                        AS

                        req soap_api.t_request; –utl_http.req;
                        resp soap_api.t_response;
                        a varchar2(3000);
                        a1 varchar2(3000);
                        a2 varchar2(3000);

                        http_request utl_http.req;

                        BEGIN

                        utl_http.set_persistent_conn_support(TRUE);
                        
                        req := soap_api.new_request(p_method => 'listaCartoesVagos', p_namespace => 'xmlns="UsuariosCartoes"');
                        
                        soap_api.add_parameter(p_name => '_token',p_request => req,p_type => 'xsd:string',p_value => '123');
                        
                        soap_api.add_parameter(p_request => req, p_name => 'codEmpresa',p_type => 'xsd:string', p_value => web_service_param);
                        
                        resp := soap_api.invoke(p_request => req, p_url => web_service, p_action => '');
                        
                        a:= soap_api.get_return_value(p_response => resp, p_name => 'msg', p_namespace => 'xmlns="http://services.mdc.com.br"');
                        a1:= soap_api.get_return_value(p_response => resp, p_name => 'status', p_namespace => 'xmlns="http://services.mdc.com.br"');
                        a2:= soap_api.get_return_value(p_response => resp, p_name => 'listaCartoes', p_namespace => 'xmlns="http://services.mdc.com.br"');
                        

                        — return a||’ – ‘||a1||’ – ‘||a2;

                        return a2;
                        

                        END;

                        Obrigado.

                        Airton

                      Visualizando 10 posts - 1 até 10 (de 10 do total)
                      • Você deve fazer login para responder a este tópico.
                      plugins premium WordPress