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.

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";
  }
}

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.

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';

Código para testar a função.

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;

Caso ocorrer esse erro:

ORA-29531: no method atualizarParam in class Parametro

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

Share


2 comentários

  1. #
    André
    julho 1st, 2010 at 13:03

    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.

    Responda a esse comentário
    • #
      Roberto Furutani
      julho 1st, 2010 at 18:06

      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.

      Responda a esse comentário

Deixe um comentário