Pular para o conteúdo

Oracle Java Stored Procedure

Olá!
No banco de dados Oracle, além de guardar dados é possivel criar rotinas para manipulá-los. A linguagem default é o PL/SQL mas é possivel criar rotinas em Java.
Teoricamente é possível usar todos os recursos da linguagem e de mais algumas tecnologias como Java Mail, JMS, fazer chamadas a EJBs. Acredito que só não seja possível usar classes de interface gráfica (JFrame, JPanel e etc.).
No caso do JavaMail é preciso que o objeto tenha um grant especial senão ele conseguirá enviar os emails.
Abaixo um exemplo de classe que executa um update em uma tabela de paramêtros.

[sourcecode language=”java”]
create or replace and compile java source named
Parametro as

import java.sql.*;
import oracle.jdbc.driver.*;

public class Parametro {
public static java.lang.String
atualizarParam(java.lang.String codigo,
java.lang.String valor)
throws SQLException {

// Obtem um conexão com o banco de dados
Connection conn = new OracleDriver().defaultConnection();

String sql = “UPDATE tab_param SET ” +
“vlr_par = ? WHERE cod_param = ?”;

// Todos os parametros devem estar preenchidos
if (codigo == null || valor == null){
return “Parametros nulo”;
}

try {

PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, valor);
pstmt.setString(2, codigo);
pstmt.executeUpdate();
pstmt.close();
conn.commit();

} catch (SQLException e) {
return e.getMessage();
}

return “OK”;
}
}[/sourcecode]
Como não é possível chamar a classe Java diretamente, preciamos criar uma função PL/SQL encarregada de invocar o método da classe Java.
[sourcecode language=”sql”]
create or replace function fun_atualizar(codigo varchar2, valor varchar2)
return varchar2 is
LANGUAGE JAVA NAME ‘Parametro.atualizarParam(java.lang.String, java.lang.String) return java.lang.String’;[/sourcecode]

Código para testar a função.
[sourcecode language=”sql”]
declare
retorno varchar2(500);
begin
retorno := fun_atualizar(‘parametro’,’valor’);

dbms_output.put_line(retorno);

exception
when others then
dbms_output.put_line(‘Erro -> ‘ || sqlerrm);
end;[/sourcecode]
Caso ocorrer esse erro:
[sourcecode language=”sql”]
ORA-29531: no method atualizarParam in class Parametro
[/sourcecode]
Verifique se os tipo dos paramêtros na function atualizar estão corretos, por exemplo:
– Se o nome das classes estão completos. Ao invés de String deve estar java.lang.String;
– Se os tipos primitivos estão todas em minúsculas. No lugar de Int deve ser int ou FLOAT deve ser float.

Até mais

2 comentários em “Oracle Java Stored Procedure”

  1. O código JAVA gerado fica compilado ou o DBA tem acesso ao código fonte?

    Como eu posso chamar uma classe JAVA compila externa ao banco Oracle por meio de uma procedure ou package Pl-SQL?

    grato.

    1. Olá

      Dessa maneira o DBA tem acesso ao fonte, a não ser que você encripte a classe
      Para chamar uma classe compilada fora do banco você teria que gerar um jar dele, usar o comando loadjava e importa-lo dentro de uma JSP. diretamente do pl/sql não tem como.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *