List Files in a Directory From PL/SQL and SQL : Java
This article shows how to list files in a directory on the database server using Java in the database.
oracle miscconfigurationintermediate
by OracleDba
12 views
This article shows how to list files in a directory on the database server using Java in the database.
12345678910
CONN sys/SysPassword1@//localhost:1521/pdb1 AS SYSDBA
--DROP USER testuser1 CASCADE;
CREATE USER testuser1 IDENTIFIED BY testuser1 QUOTA UNLIMITED ON users;
GRANT CREATE SESSION, CREATE PROCEDURE, CREATE TYPE, CREATE VIEW TO testuser1;
EXEC DBMS_JAVA.grant_permission('TESTUSER1', 'java.io.FilePermission', '<
>', 'read');
EXEC DBMS_JAVA.grant_permission('TESTUSER1', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
GRANT JAVAUSERPRIV TO TESTUSER1;1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
CONN testuser1/testuser1@//localhost:1521/pdb1
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "FileListHandler" AS
import java.lang.*;
import java.util.*;
import java.io.*;
public class FileListHandler
{
public static String list (String path) {
String list = "";
File myFile = new File (path);
String[] arrayList = myFile.list();
Arrays.sort(arrayList, String.CASE_INSENSITIVE_ORDER);
for (int i=0; i < arrayList.length; i++) {
// Prevent directory listing expanding if we will blow VARCHAR2 limit.
if ((list.length() + arrayList[i].length() + 1) > 32767)
break;
if (!list.equals(""))
list += "," + arrayList[i];
else
list += arrayList[i];
}
return list;
}
};
/
show errors java source "FileListHandler"
CREATE OR REPLACE PACKAGE file_list_api AS
FUNCTION list (p_path IN VARCHAR2) RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'FileListHandler.list (java.lang.String) return java.lang.String';
END file_list_api;
/
SHOW ERRORS
CREATE OR REPLACE TYPE t_varchar2_arr AS TABLE OF VARCHAR2(500);
/
CREATE OR REPLACE FUNCTION get_files (p_dir IN VARCHAR2)
RETURN t_varchar2_arr PIPELINED
AS
l_array APEX_APPLICATION_GLOBAL.vc_arr2;
l_string VARCHAR2(32767);
BEGIN
l_array:= APEX_STRING.string_to_table(FILE_LIST_API.list(p_dir), ',');
FOR i in 1..l_array.count LOOP
PIPE ROW(l_array(i));
END LOOP;
RETURN;
END;
/123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE('Output : ' || FILE_LIST_API.list ('/u01/app/oracle/diag/rdbms/cdb1/cdb1/trace'));
END;
/
Output : alert_cdb1.log,cdb1_cjq0_18139.trc,cdb1_cjq0_18139.trm,cdb1_dbrm_15137.trc,cdb1_dbrm_15137.trm ...
... removed for brevity ...
cdb1_vktm_17896.trc,cdb1_vktm_17896.trm
PL/SQL procedure successfully completed.
SQL>
DECLARE
l_array APEX_APPLICATION_GLOBAL.vc_arr2;
l_string varchar2(2000);
BEGIN
l_array:= APEX_STRING.string_to_table(FILE_LIST_API.list ('/u01/app/oracle/diag/rdbms/cdb1/cdb1/trace'), ',');
FOR i in 1..l_array.count LOOP
DBMS_OUTPUT.put_line('Array(' || i || ') : ' || l_array(i));
END LOOP;
END;
/
Array(1) : alert_cdb1.log
Array(2) : cdb1_cjq0_18139.trc
Array(3) : cdb1_cjq0_18139.trm
Array(4) : cdb1_dbrm_15137.trc
... removed for brevity ...
Array(531) : cdb1_vktm_17026.trm
Array(532) : cdb1_vktm_17896.trc
Array(533) : cdb1_vktm_17896.trm
PL/SQL procedure successfully completed.
SQL>
COLUMN file_name FORMAT A30
SELECT column_value AS file_name
FROM TABLE(get_files('/u01/app/oracle/diag/rdbms/cdb1/cdb1/trace'));
FILE_NAME
------------------------------
alert_cdb1.log
cdb1_cjq0_18139.trc
cdb1_cjq0_18139.trm
... removed for brevity ...
cdb1_vktm_17896.trc
cdb1_vktm_17896.trm
539 rows selected.
SQL>
SELECT column_value AS file_name
FROM TABLE(get_files('/u01/app/oracle/diag/rdbms/cdb1/cdb1/trace'))
WHERE column_value LIKE 'alert%';
FILE_NAME
------------------------------
alert_cdb1.log
SQL>12345678
CREATE OR REPLACE VIEW trace_files_v AS
SELECT column_value AS file_name
FROM TABLE(get_files('/u01/app/oracle/diag/rdbms/cdb1/cdb1/trace'));
CREATE OR REPLACE VIEW alert_log_v AS
SELECT column_value AS file_name
FROM TABLE(get_files('/u01/app/oracle/diag/rdbms/cdb1/cdb1/trace'))
WHERE column_value LIKE 'alert%';12345678910111213141516171819202122232425262728293031323334353637383940
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "FileListHandler" AS
import java.io.File;
import java.lang.Exception;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.Array;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleDriver;
public class FileListHandler
{
public static Array list (String path) throws Exception {
Path directory = Paths.get(path);
if (!Files.isDirectory(directory))
throw new Exception("path argument does not reference a directory (" + path + ")");
File[] files = directory.toFile().listFiles();
OracleConnection connection = (OracleConnection)(new OracleDriver()).defaultConnection();
return connection.createOracleArray("T_VARCHAR2_ARR", files);
}
};
/
CREATE OR REPLACE TYPE t_varchar2_arr AS TABLE OF VARCHAR2(500);
/
CREATE OR REPLACE PACKAGE file_list_api AS
FUNCTION list (p_path IN VARCHAR2) RETURN t_varchar2_arr
AS LANGUAGE JAVA
NAME 'FileListHandler.list (java.lang.String) return java.sql.Array';
END file_list_api;
/
-- Query it like this.
SELECT * FROM table(FILE_LIST_API.list ('/u01/app/oracle/diag/rdbms/cdb1/cdb1/trace'));Please to add comments
No comments yet. Be the first to comment!