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
Daniel trabalha atualmente como Administrador de Banco de Dados Sénior em Luanda, prestando serviços para o Ministério das Finanças de Angola. Conta com mais 16 anos de experiência com tecnologias Oracle. Iniciou sua carreira como desenvolvedor Oracle, onde participou no desenvolvimento de um software ERP desde sua definição até sua implantação. Mudou-se para a Inglaterra em 2006 onde atuou como Senior DBA Oracle prestando serviços para várias empresas de peso como o grupo TimeWarner, British Film Institute, Johnson&Johnson e John Deere, para mencionar alguns. Daniel é membro do seleto grupo de profissionais Oracle que possuem a credencial OCM 11g – Oracle Certified Master e, dentre suas especialidades, destacam-se o design e implementação de alta escalabilidade, alta disponibilidade e performance tuning