Back-End

26 set, 2013

Oracle External Procedures

Publicidade

Introdução

External procedures é uma tecnologia da linguagem PL/SQL que permite a criação de procedimentos e funções utilizando outra linguagem de programação. Esse recurso nada mais é que uma rotina de uma linguagem gravada em uma dynamic link library (DLL), conhecida pelo banco de dados e executada como se fosse um subprograma PL/SQL.

Note que, por ser gravado em DLL, esse recurso só estará disponível em sistemas operacionais que dispõem dele recurso ou que disponham de dynamically loadable shared libraries como o Oracle Solaris.

Utilidade

Pode-se usar diversos recursos que o PL/SQL não possui por ser uma ferramenta muito específica, utilizando uma outra linguagem, como C, Java, Cobol. Dessa maneira, os usuários dessa tecnologia podem usufruir do melhor que cada linguagem oferece e usar dentro do PL/SQL.

Outras Utilidades:

  • Mover o processamento feito no cliente para o servidor;
  • Reutilizar código feito em outra linguagem;
  • Desempenho (uso de linguagens propícias para certas operações).

Criando uma external procedure  

Para este exemplo, será feito uso da linguagem Java. Esse procedimento pode ser feito de duas maneiras. A primeira delas consiste em apresentar uma classe compilada ao banco de dados; a outra, usar o JDK do próprio banco de dados.

Usando a primeira forma, deve-se primeiro criar o diretório no qual o Oracle irá procurar as classes compiladas.

[oracle@bernardo artigo]$ pwd
/home/oracle/artigo
[oracle@bernardo artigo]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Tue Aug 20 09:11:07 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Conectado a:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production

SQL> create directory artigo_dir as 'home/oracle/artigo';

Diretorio criado.

Quadro 1 – Criando diretório Oracle

Observe que no Quadro 1 o usuário autenticou-se como sysdba, ou seja, possui todos os privilégios do banco, porém, nem sempre um usuário tem tal privilégio. Para conceder, use o comando abaixo:

SQL> grant create any directory to usuario_xyz;

O segundo passo é carregar a classe compilada no banco de dados. O Oracle so irá carregar esta classe para a memória no momento em que a mesma for usada, portanto, não há impacto no desempenho.

SQL> create java class using bfile (artigo_dir,'Calculadora.class');
  2  /
Java created.

Quadro 2 – Carregando via arquivo class

Caso opte por compilar a classe no banco, deve-se usar o utilitário loadjava:

[oracle@bernardoartigo]$ loadjava -user usuario/senha /home/oracle/artigo/Calculadora.java -resolve

Quadro 3 – Carregando através do compilador do banco

Para exemplificar, uma classe simples Java com apenas um método que soma dois números inteiros.

 

public class Calculadora {

    public static int soma(int a, int b){
        return a+b;
    }
}

Quadro 4 – Classe Calculadora

Publicando a classe

Para acessar o método “soma” da classe “Calculadora” deve-se primeiro criar uma stored procedure que responde por este método, isto é uma limitação desta tecnologia, não se pode chamar uma classe Java diretamente, precisa-de uma função intermediária. Nestas funções indicamos através do comando AS LANGUAGE que esta, tem o retorno na linguagem especificada.

SQL> create or replace FUNCTION calculadora (A NUMBER, B NUMBER) RETURN NUMBER AS
                 LANGUAGE JAVA
                NAME 'Calculadora.soma(int,int) return int';
/
Function created.

Quadro 5 – Publicando o método Java

Observa-se no Quadro 5 que carrega-se um método da classe e que se especifica a assinatura completa do mesmo; no exemplo, não havia organização por pacotes, mas seria necessário se existisse.

Com a função intermediária criada, já se tem o necessário para desfrutar do código escrito na linguagem Java e chamá-lo através do banco de dados.

SQL> set serveroutput on;
SQL> declare
   r number;
  begin
  r:= calculadora(2,7);
  dbms_output.put_line('Resultado:'||r);
  end;
  /
Resultado:9
PL/SQL procedure successfully completed.

Quadro 6 – Chamando a external procedure

Troubleshooting

Ao tentar compilar a função recebe o erro:

System error : java/lang/UnsupportedClassVersionError oracle stored procedure

Esse erro se dá pelo fato de que a versão do JDK dentro do Oracle é diferente da versão que compilou a classe. Deve-se ter certeza de que o javac que compilou a classe é menor ou igual a versão do JDK da Oracle.

Para verificar a versão do jdk usado no banco segue o comando:

#cd $ORACLE_HOME/jdk/bin
#java –version

Quadro 7 – Verificando o JDK do banco