有一個C庫/ listener.ora中/庫/外部函數的方法。這可能是對XE版有幫助那裏是不是Java
注:當有上市超過32000個字符這個解決方案會導致緩衝區溢出
1)準備好你的共享C庫目錄(list.c) - 這絕對不是C語言中最安全的使用代碼目錄列表的最佳解決方案。但是你有了基本的想法。
//
// FILE: list.c
//
// gcc -Wall -fPIC -c list.c
// gcc -shared -o list.so list.o
// mkdir -p /u01/lib
// cp list.so /u01/lib
//
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
char *list_dir(const char *path) {
char *filelist;
filelist=(char *) calloc(32000,sizeof(char));
struct dirent *entry;
DIR *dir=opendir(path);
if (dir==NULL) {
return;
}
strcat(filelist,"");
while ((entry = readdir(dir)) != NULL) {
strcat(filelist,entry->d_name);
strcat(filelist,"\n");
}
strcat(filelist,"\0");
closedir(dir);
return (filelist);
}
2)編輯您的LISTENER.ORA
...
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = <PATH TO ORACLE >)
(ENVS="EXTPROC_DLLS=/u01/lib/list.so")
^^^^^^^^^^^^^^^^^^^^ This line enables calling of external libs
(PROGRAM = extproc)
)
...
3)準備數據庫對象
create or replace library c_list is '/u01/lib/list.so';
/
create or replace function host_list(v_directory in varchar2) return varchar2 as external
name "list_dir"
library c_list
language c
parameters (v_directory string, return string);
/
最後與使用它:
declare
v_ret varchar2(32000);
begin
v_ret := host_list('/u01');
dbms_output.put_line(v_ret);
end;
/
當然你也可以修改C和字符串post-pr適合您的需求。
致以問候
P.S.您可以按如下
create or replace package sysop as
type file_list_rec is record(filename varchar2(1024));
type file_list is table of file_list_rec;
function ls(v_directory varchar2) return file_list pipelined;
end;
/
create or replace package body sysop as
function ls(v_directory varchar2) return file_list pipelined is
rec file_list_rec;
v_host_list varchar2(32000) := '';
begin
v_host_list := host_list(v_directory);
for file in (
select regexp_substr(v_host_list, '[^'||chr(10)||']+', 1, level)
from dual
connect by
regexp_substr(v_host_list, '[^'||chr(10)||']+', 1, level) is not null)
loop
pipe row (file);
end loop;
return;
end ls;
end sysop;
/
結果轉換成表,並把它像這樣:
select * from table(sysop.ls('/u01')) order by 1;
歡迎SO!請編輯您的問題並添加一些附加信息:文件名列表(數據庫表?),樣本輸入和預期輸出的來源是什麼。 –
請澄清一下:你的數據庫服務器*上是否有一個目錄*,並且想要獲取它的內容列表?或者你的客戶*上有一個目錄? –
你問如何在plsql中聲明變量? oracle_string:='[a_001] [b_1001] [c_2001]'?或者它是否必須動態創建?嘗試在這裏問適當的問題;) – massko