2011-03-01 11 views
1

我有一個過程無效目錄路徑,並同時執行產生Oracle中的CSV文件(在Windows)的程序

create or replace procedure dump_table_to_csv(p_tname in varchar2, 
    2             p_dir in varchar2, 
    3             p_filename in varchar2) 
    4 is 
    5  l_output  utl_file.file_type; 
    6  l_theCursor  integer default dbms_sql.open_cursor; 
    7  l_columnValue varchar2(4000); 
    8  l_status  integer; 
    9  l_query   varchar2(1000) 
10      default 'select * from ' || p_tname; 
11  l_colCnt  number := 0; 
12  l_separator  varchar2(1); 
13  l_descTbl  dbms_sql.desc_tab; 
14 begin 
15  l_output := utl_file.fopen(p_dir, p_filename, 'w'); 
16  execute immediate 'alter session set nls_date_format=''dd-mon-yyyy hh24:mi:ss'' 
'; 
17 
18  dbms_sql.parse( l_theCursor, l_query, dbms_sql.native); 
19  dbms_sql.describe_columns(l_theCursor, l_colCnt, l_descTbl); 
20 
21  for i in 1 .. l_colCnt loop 
22   utl_file.put(l_output, l_separator || '"' || l_descTbl(i).col_name || '"' 
); 
23   dbms_sql.define_column(l_theCursor, i, l_columnValue, 4000); 
24   l_separator := ','; 
25  end loop; 
26  utl_file.new_line(l_output); 
27 
28  l_status := dbms_sql.execute(l_theCursor); 
29 
30  while (dbms_sql.fetch_rows(l_theCursor) > 0) loop 
31   l_separator := ''; 
32   for i in 1 .. l_colCnt loop 
33    dbms_sql.column_value(l_theCursor, i, l_columnValue); 
34    utl_file.put(l_output, l_separator || l_columnValue); 
35    l_separator := ','; 
36   end loop; 
37   utl_file.new_line(l_output); 
38  end loop; 
39  dbms_sql.close_cursor(l_theCursor); 
40  utl_file.fclose(l_output); 
41 
42  execute immediate 'alter session set nls_date_format=''dd-MON-yy'' '; 
43 exception 
44  when others then 
45   execute immediate 'alter session set nls_date_format=''dd-MON-yy'' '; 
46   raise; 
47 end; 
48/

當我嘗試執行

exec dump_table_to_csv('emp', 'C:\Temp','a.txt') 

我正在錯誤 (錯誤):錯誤執行的語句:ORA-29280:無效的目錄路徑ORA-06512:在 「LCM_EVAL.DUMP_TABLE_TO_CSV」 59行ORA-06512:在2號線

什麼是可能的概率LEM?

回答

1

錯誤消息非常明顯:路徑無效。最有可能它只是一個錯字:C:/Temp不存在,但也許C:\Temp呢。

這也可能是一個贈款問題。在PL/SQL中,如果您已獲得特定權限,則只能訪問該磁盤。該UTL_FILE documentation說明如何授予訪問PL/SQL:

  • (推薦)創建一個具有DBA帳戶的目錄,授予用戶。
  • (作廢)使用UTL_FILE_DIR系統參數。要小心,這是一個全系統參數,所有用戶將能夠寫入和讀取此目錄。
+0

是的,這是一個錯字 – 2011-03-01 10:02:27

0

任何與UTL_FILE發生在數據庫服務器上,而不是客戶端上。確保該目錄存在於服務器上,並且Oracle用戶有權寫入該目錄。

相關問題