Cómo leer o escribir ficheros locales desde Oracle 11g > 12C

Hola,

Si necesitamos leer ficheros locales en nuestra interfaz, podemos hacerlo con un procedimiento en Java. Como sabemos, Oracle dispone de un motor java que permite ejecutar código y utilizarlo dentro de nuestras funciones o procedimientos PL/SQL.

Para poder leer el contenido de un directorio y obtener la lista de ficheros, debemos ejecutar lo siguiente:

  CREATE OR REPLACE TYPE file_list AS TABLE OF VARCHAR2(255);

/
 
  CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "ListVirtualDirectory" AS
  import java.io.*;
  import java.security.AccessControlException;
  import java.sql.*;
  import oracle.sql.driver.*;
  import oracle.sql.ArrayDescriptor;
  import oracle.sql.ARRAY;

  public class ListVirtualDirectory {
    public static ARRAY getList(String path) throws SQLException, AccessControlException {

    Connection conn = DriverManager.getConnection("jdbc:default:connection:");

    File directory = new File(path);

    ArrayDescriptor arrayDescriptor = new ArrayDescriptor("FILE_LIST",conn);

    ARRAY listed = new ARRAY(arrayDescriptor,conn,((Object[])directory.list()));
  return listed; }}

/
 
CREATE OR REPLACE FUNCTION list_files(path VARCHAR2) RETURN FILE_LIST IS
LANGUAGE JAVA
NAME 'ListVirtualDirectory.getList(java.lang.String) return oracle.sql.ARRAY';

Ahora asignaremos permisos al procedimiento java para que éste pueda leer el directorio local.

Lectura:

BEGIN
  DBMS_JAVA.GRANT_PERMISSION('USUARIO' --USUARIO DE ESQUEMA
                             ,'SYS:java.io.FilePermission'
                             ,'C:\test'  --DIR LOCAL
                             ,'read'); --PERMISOS
  END;
 
Escritura:
 
BEGIN
  DBMS_JAVA.GRANT_PERMISSION('USUARIO' --USUARIO DE ESQUEMA
                             ,'SYS:java.io.FilePermission'
                             ,'C:\test'  --DIR LOCAL
                             ,'write'); --PERMISOS
  END;


Asignamos permisos al usuario normal (no sys) para que pueda utilizar el procedimiento java:

GRANT EXECUTE ON list_files TO  USUARIO;

Finalmente para obtener el contenido del directorio, utilizaremos la siguiente consulta:
 
  SELECT column_value FROM TABLE(list_files('C:\test\'));

Código extraído de: https://community.oracle.com/thread/2399619
 
Espero que les haya resultado útil.
Salu2. 

Share on Google Plus
    Blogger Comment

0 comentarios: