Inserindo vários registros com Procedure no WCF Adapter
Olá Pessoal.
Hoje vou falar sobre um problema que foi bem dificil resolver.
Trabalhando com o novo adaptador, o WCF-OracleDB, eu precisava executar uma procedure, através de uma send port, que insere os parametros recebidos em uma tabela.
Porem eu precisava enviar vários registros de uma única vez, não queria fazer debatching, ou criar um looping dentro da orchestration para executar a procedure várias vezes.
Fiquei um bom tempo pesquisando, e agradeço aos meus amigos Steef-Jan e ao Bruno Lins, que foram de muita ajuda.
Finalmente achei um post do Thiago Almeida, com a solução perfeita. A técnica é chamada de Composite Operation e vale tanto para o WCF-SQL como para o WCF-OracleDB.
Ao puxar o schema de uma procedure, do tipo Client(outbund operation), o schema fica parecido com esse abaixo.
Percebam que os campos estão diretamente no root node, e não tem repeating record, consequentente não dá pra enviar mais de um registro. Ou seja, se eu precisar inserir 50 linhas, vou precisar criar 50 mensagens separadamente.
Mas nem tudo está perdido, ainda é possível enviar os 50 registros de uma vez só. Então mãos a obra:
Criar schema para abrigar a procedure.
Dentro do projeto do Biztalk crie um schema. Para isso siga os passos:
1 – Com o botão direito do mouse clique em Add –> New Item.
2 – Escolha schema e de um nome pra ele.
3 – Clique na tag <schema>, e clique no botão […] na propriedade Imports.
4 – Na janela que irá abrir clique no botão Add, e escolha o schema da procedure.
5 – Renomeie o node Root para Request.
6 – Crie outro node e nomeie como RequestResponse.
O nome do root não tem muita importancia, mas o response devemos colocar o nome do node de request + reponse. Entao se a preferencia é deixar o node de Request como Root mesmo, o node de Response obrigatoriamente tem que ser RootResponse.
7 – No node Request adicione com o botão direito um Child Record.
8 – Nesse novo node criado, na propriedade Data Structure Type escolha o node Request da procedure no meu caso SP_BTS_POC_INSERE
10 – Repita os passos 8 e 9 para o node RequestResponse, agora escolhendo o node de Response da procedure.
11 – No node de Request, sete a propriedade Max Occurs para unbounded.
No final o schema deve ficar parecido com este aqui:
Agora é possível enviar vários registros para a procedure de uma única vez!
Configurando a Send Port
Quando trabalhamos com essa técnica, Composite Operation, o Action na Send Port, deve ficar um pouco diferente.
Usando o adaptador WCF-Oracle:
http://Microsoft.LobServices.OracleDB/2007/03/CompositeOperation
Usando o adaptador WCF-SQL:
CompositeOperation
Neste artigo vimos como enviar em uma send port vários registros para executar a procedure de uma única vez.
Espero que possa ser útil para mais alguém.
Até a próxima.
Seja o primeiro a comentar ;)
Postar um comentário