Dev (Back & Front)ARTIGO

Oracle External Procedures

External procedures é uma tecnologia da linguagem PL/SQL que permite criar procedimentos e funções usando outra linguagem de programação.

Introdução

External procedures é uma tecnologia da linguagem PL/SQLSQL64 conteúdosSQL Server – Como evitar SQL Injection?Data · mai 2019Azure SQL DB Managed InstanceData · abr 2019SQL Server – Como evitar SQL Injection? Pare de utilizar Query Dinâmica como EXEC(@Query)Data · abr 2019Ver tudo em Data 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, JavaJava42 conteúdosNovidades do Java 26 (para desenvolvedores)Dev (Back & Front) · mar 2026Visual Studio Code para Java: o guia completo (dicas, configuração e extensões)Dev (Back & Front) · out 2025Quarkus: Modernizando a linguagem Java para a era da nuvemDev (Back & Front) · nov 2020Ver tudo em Dev (Back & Front) , 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

 

é DBA Oracle/Consultor Técnico na empresa LB2 Consultoria e Tecnologia em Londrina-PR, onde trabalha dando consultoria em banco de dados Oracle 10g/11g para diversas empresas.

Ver perfil