برای اینکار هیچ پکیج PL/SQl از قبل نوشته شده ای وجود نداره برای رسیدن به نتیجه باید یک external table ساخت و با استفاده از یک pre-processor اطلاعات مورد نیاز رو برگردوند متاسفانه این pre-processor ما براساس پلتفرم کار میکنه

برای سیستم عاملهای یونیک بیس و خانواده لینوکس:

step0:
[oracle@localhost]$ df -B 1 /usr
Filesystem 1B-blocks Used Available Use% Mounted on
/dev/sda3 24770654208 22113492992 1398870016 95% /
step1: 
[oracle@localhost ~]$ cat /tmp/demo/demo.dat
/usr
step2: 
[oracle@localhost ~]$ cat /tmp/demo/df.sh
#!/bin/bash
/bin/df -B 1 `/bin/cat ${1}` | /bin/awk 'NR == 2 {print $4}'
step3: 
create or replace directory DEMO as '/tmp/demo'
step4: 
CREATE TABLE
df
(
free NUMBER
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY DEMO
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE CHARACTERSET WE8MSWIN1252
NOBADFILE
NOLOGFILE
PREPROCESSOR demo:'df.sh'
FIELDS TERMINATED BY "|" LDRTRIM
REJECT ROWS WITH ALL NULL FIELDS
(
free CHAR
)
)
LOCATION
(
'demo.dat'
)
)
REJECT LIMIT UNLIMITED
;
step5: 
SQL> select * from df;

FREE
----------
1398870016

فقط نکته‌ای که داره اینه که سایز پارتیشن‌ها رو براساس نقاط مانت شده درمیاره و اون نقطه مانت شده ای که میدید حتما باید رو یه پارتیشن جدا باشه تا سایزش رو نشون بده و اگه اون نقطه زیرمجموعه یه نقظه دیگه باشه حتما باید نقطه اصلی رو بدید تا سایز اون پارتیشن رو بفهمید

برای سیستم عاملهای windows:

برگرفته شده از

http://searchwindowsserver.techtarget.com/tip/Determining-free-disk-space-on-Windows-NT

step0:
/*Filename on companion disk: nt_space.sql*/
CREATE OR REPLACE LIBRARY nt_kernel
AS
'c:winntsystem32kernel32.dll';
step1:
CREATE OR REPLACE PACKAGE disk_util
AS
FUNCTION get_disk_free_space
(root_path IN VARCHAR2,
sectors_per_cluster OUT PLS_INTEGER,
bytes_per_sector OUT PLS_INTEGER,
number_of_free_clusters OUT PLS_INTEGER,
total_number_of_clusters OUT PLS_INTEGER)
RETURN PLS_INTEGER;
PRAGMA RESTRICT_REFERENCES (get_disk_free_space,
WNPS, RNPS, WNDS, RNDS);
END disk_util;
step2:
CREATE OR REPLACE PACKAGE BODY disk_util
AS
FUNCTION get_disk_free_space
(root_path IN VARCHAR2,
sectors_per_cluster OUT PLS_INTEGER,
bytes_per_sector OUT PLS_INTEGER,
number_of_free_clusters OUT PLS_INTEGER,
total_number_of_clusters OUT PLS_INTEGER)
RETURN PLS_INTEGER
IS EXTERNAL
LIBRARY nt_kernel -- our library (defined previously)
NAME "GetDiskFreeSpaceA"-- name of function in kernel32.dll
LANGUAGE C -- external routine is written in C
CALLING STANDARD PASCAL -- uses Pascal parameter convention
PARAMETERS -- map PL/SQL to C parameters by position
(root_path STRING,
sectors_per_cluster BY REFERENCE LONG,
bytes_per_sector BY REFERENCE LONG,
number_of_free_clusters BY REFERENCE LONG,
total_number_of_clusters BY REFERENCE LONG,
RETURN LONG);-- "return code" indicating success or failure
END disk_util;
step3:
SET SERVEROUTPUT ON SIZE 100000
DECLARE
lroot_path VARCHAR2(3) := 'C: '; -- look at C drive
lsectors_per_cluster PLS_INTEGER;
lbytes_per_sector PLS_INTEGER;
lnumber_of_free_clusters PLS_INTEGER;
ltotal_number_of_clusters PLS_INTEGER;
return_code PLS_INTEGER;
free_meg REAL;
BEGIN
/* Call the external procedure. We ignore the return code in this simple example.*/
return_code := disk_util.get_free_disk_space (lroot_path, lsectors_per_cluster,
lbytes_per_sector,lnumber_of_free_clusters, ltotal_number_of_clusters);
/* Using the drive statistics that are returned from the external procedure,
||compute the amount of free disk space. Remember Megabytes = (Bytes / 1024 / 1024)
*/
free_meg := lsector_per_cluster * lbytes_per_sector * lnumber_of_free_clusters / 1024 / 1024;

DBMS_OUTPUT.PUT_LINE('free disk space, megabytes = '|| free_meg);
END;
step4:
free disk space, megabytes = 214.53515625