- Este tópico contém 9 respostas, 2 vozes e foi atualizado pela última vez 14 anos, 6 meses atrás por airoosp.
-
AutorPosts
-
2 de junho de 2010 às 6:28 pm #94372airoospParticipante
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
2 de junho de 2010 às 7:08 pm #94375fsitjaParticipanteVocê 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.
2 de junho de 2010 às 9:29 pm #94377airoospParticipanteBoa 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
4 de junho de 2010 às 1:39 am #94387fsitjaParticipanteOlá 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 FSITJASQL>
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>
4 de junho de 2010 às 3:20 am #94388fsitjaParticipanteA 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.
7 de junho de 2010 às 6:49 pm #94421airoospParticipanteBom 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
8 de junho de 2010 às 7:36 am #94443fsitjaParticipanteBom, 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/9 de junho de 2010 às 8:06 pm #94481airoospParticipanteBoa 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
02249002250002251099955Ainda 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
9 de junho de 2010 às 9:10 pm #94485fsitjaParticipantePelo 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?
10 de junho de 2010 às 12:05 am #94489airoospParticipanteBoa 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
-
AutorPosts
- Você deve fazer login para responder a este tópico.