Em um artigo anterior (https://blog.iprocess.com.br/2012/04/exportacao-e-importacao-de-objetos-do-oracle-bam/) vimos como utilizar o comando icommand para importar/exportar objetos do Oracle BAM, dentre eles um data object, que é a estrutura onde os dados exibidos no Oracle BAM são armazenados.
Neste tópico, veremos como atualizar a definição dos data objects do Oracle BAM de uma forma um pouco mais poderosa que utilizando o icommand, por meio dos webservices do Oracle BAM.
Problema:
Uma das limitações do icommand é que ele não permite “atualizar” um data object. Por exemplo, via icommand, não é possível incluir uma nova coluna. É preciso excluir o data object e criá-lo novamente, o que acarreta a perda de referências e também a perda de dados.
Solução:
Utilize o webservice DataObjectDefinition (https://download.oracle.com/docs/cd/E12839_01/integration.1111/e10224/bam_webservices.htm) para enviar a nova estrutura do data object, sem perder os dados existentes.
O modo de funcionamento é simples: você envia a nova estrutura do data object no payload. As colunas que existirem com o mesmo nome serão atualizadas, as que não existirem serão criadas e as que existirem mas não estiverem na nova definição, serão excluídas.
Exemplo de payload:
<?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:bam="https://xmlns.oracle.com/bam" xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Header/> <soap:Body> <bam:Update> <bam:xmlPayload> <![CDATA[ <DataObject Version="14" Name="Distribuicao" ID="_Distribuicao1" Path="/Logistica" External="0"> <Layout> <Column Name="Local" ID="_Local" Type="string" MaxSize="100" Nullable="1" Public="1" TipText=""CQ" / "Buffer" / "Direto""/> <Column Name="Quantidade" ID="_Quantidade" Type="integer" Nullable="1" Public="1"/> <Column Name="Data_Expiracao" ID="_Data_Expiracao" Type="datetime" Nullable="1" Public="1" TipText="Data de expiração dos dados no BAM"/> </Layout> </DataObject> ]]> </bam:xmlPayload> </bam:Update> </soap:Body> </soap:Envelope>
Note que o formato do payload é o mesmo que o utilizado no XML exportado ou importado via icommand, o que facilita o trabalho.
A atualização terá ocorrido com sucesso se o retorno do webservice for o elemento “UpdateResponse” vazio.