GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

Consumindo Web Services via UTL_DBWS

Considerações

– Iniciando com a versão 11.2 do banco de dados Oracle, não é mais possível instalar o UTL_DBWS utilitário diretamente no usuário SYS por razões de segurança e devido a incompatibilidades com a JVM. Porém, é possível e recomendado que o utilitário seja instalado e configurado em um schema que não seja o SYS.

Faça o download do UTL_DBWS diretamente.

Instalação

Note que todos os procedimentos abaixo devem ser executados diretamente no servidor onde se encontra o banco de dados.

Verificando a existência do utilitário UTL_DWS no schema SYS, e status de todas as classes Java e o OJVM pool size.

SQL> desc sys.utl_dbws

ERROR: 

ORA-04043: object sys.utl_dbws does not exist

Caso o objeto já existe, prossiga efetuando um drop deste objeto.

Verificando o status dos objetos do tipo JAVA CLASS.

SQL> SELECT owner, status, count(*) FROM DBA_OBJECTS WHERE OBJECT_TYPE='JAVA CLASS' GROUP BY owner, status;

OWNER STATUS COUNT(*)
------------------------------ ------- ----------;
MDSYS VALID 531
SYS VALID 20444
EXFSYS VALID 47
ORDSYS VALID 1898

É importante que não exista objetos do tipo JAVA CLASS inválidos no banco de dados antes de proceder com o resto da instalação. Caso exista objetos inválidos, verifique o MOS article ID Doc ID 1112983.1.

O próximo passo é verificar se o OJVM pool size atende as seguintes configurações mínimas:

SQL> show parameter SHARED_POOL_SIZE

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size big integer 0


SQL> show parameter JAVA_POOL_SIZE

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
java_pool_size big integer 0

SQL> alter system set SHARED_POOL_SIZE=132M scope=both;

System altered.

SQL> alter system set JAVA_POOL_SIZE=80M scope=both;

System altered.

SQL> show parameter JAVA_POOL_SIZE

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
java_pool_size big integer 80M

Extrair o arquivo dbws-callout-utility-10131.zip que foi baixado anteriormente:

É recomendável que seja feito um backup do diretório $ORACLE_HOME/sqlj antes

mv $ORACLE_HOME/sqlj $ORACLE_HOME/sqlj.org
unzip dbws-callout-utility-10131.zip sqlj* -d $ORACLE_HOME

Criar o database schema que será o owner desta instalação. Para este exemplo, criarei um schema chamado web_service_app:

SQL> show user

USER is "SYS"

SQL> create user web_service_app identified by webservice default tablespace TBSDAT_UTILS temporary tablespace temp;

Pelo menos os seguintes privilégios devem ser concedidos ao schema web_service_app:

SQL> grant connect, resource, create public synonym to web_service_app;

Configurar a variável LD_LIBRARY_PATH de acordo antes de rodar o comando que irá fazer a carga dos objetos JAVA:

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH

Carregar os objetos java utilizando o aplicativo loadjava:

cd $ORACLE_HOME/sqlj/lib

loadjava -u web_service_app/webservice -r -v -f -s -grant public -genmissing dbwsclientws.jar dbwsclientdb11.jar >& loadjava.txt

Revise o conteúdo do arquivo de saída loadjava.txt procurando por erros.

Verificando o status dos objetos do tipo JAVA CLASS.após a execução do comand loadjava acima:

SELECT owner, status, count(*) FROM DBA_OBJECTS WHERE OBJECT_TYPE='JAVA CLASS' GROUP BY owner, status;

OWNER STATUS COUNT(*)
------------------------------ ------- ----------
MDSYS VALID 531
SYS VALID 20444
EXFSYS VALID 47
ORDSYS VALID 1898

É de estrema importância que nenhuma JAVA CLASS seja reportada com status INVALID.

Neste ponto, procede-se com a instalação do wrapper, ou seja, uma package que serve de interface para a utilização dos objetos JAVA que foram carregados no passo acima:

$ cd $ORACLE_HOME/sqlj/lib
$
$ sqlplus web_service_app/webservice

SQL> @utl_dbws_decl.sql

Package created.

SQL> @utl_dbws_body.sql

Package body created.

Grant succeeded.

SQL> desc utl_dbws

PROCEDURE ADD_PARAMETER

 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 CALL_HANDLE                    NUMBER                  IN
 XML_NAME                       VARCHAR2                IN
 Q_NAME                         VARCHAR2(4096)          IN
 P_MODE                         VARCHAR2                IN

Conceder os seguintes privilégios ao schema web_service_app:

SQL> conn /as sysdba
Connected.
SQL> call dbms_java.grant_permission('SCOTT','SYS:java.lang.RuntimePermission', 'shutdownHooks', '' );
SQL> call dbms_java.grant_permission('SCOTT','SYS:java.util.logging.LoggingPermission', 'control', '' );
SQL> call dbms_java.grant_permission('SCOTT','SYS:java.util.PropertyPermission','http.proxySet','write');
SQL> call dbms_java.grant_permission('SCOTT','SYS:java.util.PropertyPermission','http.proxyHost', 'write');
SQL> call dbms_java.grant_permission('SCOTT','SYS:java.util.PropertyPermission','http.proxyPort', 'write');
SQL> call dbms_java.grant_permission('SCOTT','SYS:java.lang.RuntimePermission','getClassLoader','');
SQL> call dbms_java.grant_permission('SCOTT','SYS:java.net.SocketPermission','*','connect,resolve');
SQL> call dbms_java.grant_permission('SCOTT','SYS:java.util.PropertyPermission','*','read,write');
SQL> call dbms_java.grant_permission('SCOTT','SYS:java.lang.RuntimePermission','setFactory','');
SQL> call dbms_java.grant_permission('SCOTT','SYS:java.lang.RuntimePermission', 'accessClassInPackage.sun.util.calendar','');

Testando

Neste ponto, iremos fazer uso de um web service disponível na Cloud para testar o funcionamento da package UTL_DBWS que foi carregada no schema web_center_app.

É necessário criar a seguinte função em um schema de sua escolha. Esta função é responsável por criar o envelope que fará uso do UTL_DBWS para a chamada de serviços web service externos.

CREATE OR REPLACE FUNCTION celciusToFahrenheit(temperature NUMBER) RETURN VARCHAR2 AS 
   service_ web_service_app.utl_dbws.SERVICE; 
   call_ web_service_app.utl_dbws.CALL; 
   service_qname web_service_app.utl_dbws.QNAME; 
   port_qname web_service_app.utl_dbws.QNAME; 
   response sys.XMLTYPE; 
   request sys.XMLTYPE; 

BEGIN 
   web_service_app.utl_dbws.set_http_proxy('proxy.domain.com:4040'); 

   service_qname := web_service_app.utl_dbws.to_qname(null, 'CelciusToFahrenheit'); 

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

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

   web_service_app.utl_dbws.set_target_endpoint_address(call_,    'http://webservices.daehosting.com/services/TemperatureConversions.wso'); 

   web_service_app.utl_dbws.set_property( call_, 'OPERATION_STYLE', 'document'); 

   request       := sys.XMLTYPE('<CelciusToFahrenheit   xmlns="http://webservices.daehosting.com/temperature"><nCelcius>'||temperature||'</nCelcius></   CelciusToFahrenheit>'); 

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

   return response.extract('//CelciusToFahrenheitResult/child::text()',    'xmlns="http://webservices.daehosting.com/temperature"').getstringval(); 

END; 

/

Substitua a string ‘proxy.domain.com:4040’ da seguinte maneira:

– Se não existe servidor proxy, remover a linha

– Caso deva-se usar um servidor proxy, informe o nome do servidor e porta. Talvez seja necessário configurar o seu proxy para aceitar requisições feitas a partir deste servidor

A função de teste pode ser chamada da seguinte maneira:

SQL> SELECT celciusToFahrenheit(30) from dual;

CELCIUSTOFAHRENHEIT(30)
--------------------------------------------------------------------------------
86

Até a próxima

Share

You may also like...

Deixe um comentário

O seu endereço de e-mail não será publicado.