List Files in a Directory From PL/SQL and SQL : External Table
This article shows how to list files in a directory on the database server using an external table.
oracle miscconfigurationintermediate
by OracleDba
20 views
This article shows how to list files in a directory on the database server using an external table.
123456789101112131415161718192021222324252627282930313233343536373839
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 TABLE, CREATE VIEW TO testuser1;
mkdir -p /u01/fs_list/logs
mkdir -p /u01/fs_list/script
mkdir -p /u01/fs_list/control
CREATE OR REPLACE DIRECTORY fs_list_logs_dir AS '/u01/fs_list/logs/';
GRANT READ, WRITE ON DIRECTORY fs_list_logs_dir TO testuser1;
CREATE OR REPLACE DIRECTORY fs_list_script_dir AS '/u01/fs_list/script/';
GRANT READ, EXECUTE ON DIRECTORY fs_list_script_dir TO testuser1;
CREATE OR REPLACE DIRECTORY fs_list_control_dir AS '/u01/fs_list/control/';
GRANT READ ON DIRECTORY fs_list_control_dir TO testuser1;
cat > /u01/fs_list/script/list_directory.sh <<EOF
#!/bin/bash
/usr/bin/ls -l --time-style=+"%Y-%m-%d:%H:%M:%S" "\$(/usr/bin/cat \$1)"
EOF
chmod u+x /u01/fs_list/script/list_directory.sh
cat /u01/fs_list/script/list_directory.sh
#!/bin/bash
/usr/bin/ls -l --time-style=+"%Y-%m-%d:%H:%M:%S" "$(/usr/bin/cat $1)"
$
cat > /u01/fs_list/control/oraclebase.txt <<EOF
/u01/app/oracle
EOF
cat > /u01/fs_list/control/trace.txt <<EOF
/u01/app/oracle/diag/rdbms/cdb1/cdb1/trace
EOF123456789101112131415161718192021222324252627282930313233
CONN testuser1/testuser1@//localhost:1521/pdb1
DROP TABLE list_directory_ext;
CREATE TABLE list_directory_ext (
file_name VARCHAR2(200),
file_permissions VARCHAR2(11),
file_hardlinks NUMBER,
file_owner VARCHAR2(32),
file_group VARCHAR2(32),
file_size NUMBER,
file_datetime DATE
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY fs_list_logs_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
PREPROCESSOR fs_list_script_dir:'list_directory.sh'
FIELDS TERMINATED BY WHITESPACE
(
file_permissions,
file_hardlinks,
file_owner,
file_group,
file_size,
file_datetime DATE 'YYYY-MM-DD:HH24:MI:SS',
file_name
)
)
LOCATION (fs_list_control_dir:'oraclebase.txt')
)
REJECT LIMIT UNLIMITED;1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
ALTER SESSION SET nls_date_format='DD-MON-YYYY:HH24:MI:SS';
SET LINESIZE 200
COLUMN file_name FORMAT A30
COLUMN file_owner FORMAT A10
COLUMN file_group FORMAT A10
SELECT file_name,
file_permissions,
file_hardlinks,
file_owner,
file_group,
file_size,
file_datetime
FROM list_directory_ext;
FILE_NAME FILE_PERMIS FILE_HARDLINKS FILE_OWNER FILE_GROUP FILE_SIZE FILE_DATETIME
------------------------------ ----------- -------------- ---------- ---------- ---------- --------------------
admin drwxr-x---. 3 oracle oinstall 18 30-JUN-2020:11:23:07
audit drwxr-x---. 3 oracle oinstall 18 30-JUN-2020:11:25:41
cfgtoollogs drwxr-x---. 4 oracle oinstall 34 30-JUN-2020:11:25:42
checkpoints drwxr-xr-x. 2 oracle oinstall 6 30-JUN-2020:11:22:43
diag drwxrwxr-x. 23 oracle oinstall 280 30-JUN-2020:11:22:44
product drwxr-xr-x. 3 oracle oinstall 20 30-JUN-2020:11:19:02
6 rows selected.
SQL>
ALTER TABLE list_directory_ext LOCATION (fs_list_control_dir:'trace.txt');
SELECT file_name,
file_permissions,
file_hardlinks,
file_owner,
file_group,
file_size,
file_datetime
FROM list_directory_ext;
FILE_NAME FILE_PERMIS FILE_HARDLINKS FILE_OWNER FILE_GROUP FILE_SIZE FILE_DATETIME
------------------------------ ----------- -------------- ---------- ---------- ---------- --------------------
alert_cdb1.log -rw-r-----. 1 oracle oinstall 172573 30-JUN-2020:17:48:43
cdb1_dbrm_15137.trc -rw-r-----. 1 oracle oinstall 1061 30-JUN-2020:11:23:16
cdb1_dbrm_15137.trm -rw-r-----. 1 oracle oinstall 912 30-JUN-2020:11:23:16
... deleted for brevity ...
cdb1_vktm_17026.trm -rw-r-----. 1 oracle oinstall 952 30-JUN-2020:11:56:17
cdb1_vktm_17896.trc -rw-r-----. 1 oracle oinstall 1230 30-JUN-2020:11:56:37
cdb1_vktm_17896.trm -rw-r-----. 1 oracle oinstall 930 30-JUN-2020:11:56:37
423 rows selected.
SQL>
ALTER TABLE list_directory_ext LOCATION (fs_list_control_dir:'oraclebase.txt');
SELECT file_name,
file_permissions,
file_hardlinks,
file_owner,
file_group,
file_size,
file_datetime
FROM list_directory_ext EXTERNAL MODIFY (LOCATION (fs_list_control_dir:'trace.txt'));
FILE_NAME FILE_PERMIS FILE_HARDLINKS FILE_OWNER FILE_GROUP FILE_SIZE FILE_DATETIME
------------------------------ ----------- -------------- ---------- ---------- ---------- --------------------
alert_cdb1.log -rw-r-----. 1 oracle oinstall 172573 30-JUN-2020:17:48:43
cdb1_dbrm_15137.trc -rw-r-----. 1 oracle oinstall 1061 30-JUN-2020:11:23:16
cdb1_dbrm_15137.trm -rw-r-----. 1 oracle oinstall 912 30-JUN-2020:11:23:16
... deleted for brevity ...
cdb1_vktm_17026.trm -rw-r-----. 1 oracle oinstall 952 30-JUN-2020:11:56:17
cdb1_vktm_17896.trc -rw-r-----. 1 oracle oinstall 1230 30-JUN-2020:11:56:37
cdb1_vktm_17896.trm -rw-r-----. 1 oracle oinstall 930 30-JUN-2020:11:56:37
423 rows selected.
SQL>123456789
CREATE OR REPLACE VIEW oraclebase_files_v AS
SELECT *
FROM list_directory_ext EXTERNAL MODIFY (LOCATION (fs_list_control_dir:'oraclebase.txt'))
WHERE file_permissions NOT LIKE 'd%';
CREATE OR REPLACE VIEW trace_files_v AS
SELECT *
FROM list_directory_ext EXTERNAL MODIFY (LOCATION (fs_list_control_dir:'trace.txt'))
WHERE file_permissions NOT LIKE 'd%';Please to add comments
No comments yet. Be the first to comment!