Etiket arşivi: plsql ile dizin listeleme

PLSQL ile Dizin Listeleme

PLSQL ile dizin listeleme

Bu makalemizde SYS.DBMS_BACKUP_RESTORE paketi ile oracle’ın bir dizininde hangi dosyalar var onları listeleyeceğiz.Benzer örneği java ile bir başka makalede yapmıştık.Ona da bakmak isterseniz;
java ile dizin listelemeye göz atabilirsiniz..

-SYS ile oracle type create ediyoruz.

CREATE TYPE file_array AS TABLE OF VARCHAR2(200);

-SYS ile fonksiyonumuzu oluşturuyoruz.

CREATE OR REPLACE FUNCTION LIST_FILES (dir_name IN VARCHAR2,lp_string IN VARCHAR2 DEFAULT NULL)
RETURN file_array pipelined AS
lv_pattern VARCHAR2(1024);
lv_ns VARCHAR2(1024);
BEGIN
SELECT directory_path
INTO lv_pattern
FROM dba_directories
WHERE directory_name=dir_name;
SYS.DBMS_BACKUP_RESTORE.SEARCHFILES(lv_pattern, lv_ns);
FOR file_list IN (SELECT FNAME_KRBMSFT AS file_name
FROM X$KRBMSFT
WHERE FNAME_KRBMSFT LIKE '%'|| NVL(lp_string, FNAME_KRBMSFT)||'%' ) LOOP
PIPE ROW(file_list.file_name);
END LOOP;
END;

-Fonksiyonumuza yetki verip synonym oluşturuyoruz.

GRANT EXECUTE ON list_files TO PUBLIC;
CREATE PUBLIC SYNONYM list_files FOR sys.list_files;

-Dizin adını verip fonksiyonumuzu test edelim.

SELECT * FROM TABLE(list_files('DATA_PUMP_DIR'));
C:\ORACLE\ADMIN\ORCL\DPDUMP\dp.log

SELECT * FROM TABLE(list_files('DATA_FILE_DIR'));
C:\ORACLE\PRODUCT\11.2.0\DBHOME_1\DEMO\SCHEMA\SALES_HISTORY\olp_v3.sql
C:\ORACLE\PRODUCT\11.2.0\DBHOME_1\DEMO\SCHEMA\SALES_HISTORY\sale1v3.dat

Umarım faydalı olur..

 

 

Plsql ve java ile dizin listeleme

Plsql ve java ile dizin listeleme

Belli bir dizindeki xml dosyalarını okuyup içinden bazı verileri almam gerekiyordu.Bu sebeple aşağıdaki gibi bir fonksiyona ihtiyacım oldu.Bu fonksiyonla belirli bir dizini taratıp dosyaları belirlemek mümkün. Aynı işi yapan plsql kodları da var, ama biz java ile yapalım.Plsql içinde javanın kullanımına da örnek teşkil etmiş olsun.
En son kodumuzda oldugu gibi dizini verip adını öğrendiğiniz xml dosyayı okuyup içeriğine erişebilirsiniz..
Onu farklı bir makalede yazmayı düşünüyorum.

Öncelikle file_list adında bir type create edelim

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

Dizini tarayacak java kodumuzu yazıp compile edelim..

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

Dizin verip listesini alacağımız fonksiyonu oluşturalım.

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

Şimdi dizinimizi tarayalım, bakalım hangi dosyalar var.

SELECT COLUMN_VALUE xml_file_name FROM TABLE(list_files('C:\xmlfiles'));

xml_file_name
06012014.xml
07012014.xml
08012014.xml
09012014.xml

Başka bir dizin verip sonuca bakalım.

SELECT COLUMN_VALUE xml_file_name FROM TABLE(list_files('E:\'));

xml_file_name
$RECYCLE.BIN
Boot
bootmgr
BOOTSECT.BAK
grldr
System Volume Information
vs2010
winx.ld

Umarım faydalı olur..