我必須每天加載一些文件到我們的數據庫系統。我的解決方案是使用java過程來生成目錄文件夾中所有文件的表格,並通過外部表格加載程序遍歷每個文件。我正在爲兩個掛斷本掛在For For循環和外部表加載器的變量
Declare
what_to_load VARCHAR2(255);
CURSOR folder_contents
IS
select filename
from database.DIR_LIST
where filename like 'DCOpenOrders_%'
and filename like '%.csv';
BEGIN
DELETE FROM database.DIR_LIST;
database.GET_DIR_LIST('directory_path_files_are_in');
FOR each_record IN folder_contents
LOOP
what_to_load := each_record.filename;
EXECUTE IMMEDIATE 'DROP table database.my_table';
execute immediate 'CREATE table database.my_table
(Region VARCHAR2(10),
District VARCHAR2(10),
Originating_Store VARCHAR2(80),
Order_Date VARCHAR2(30),
Ship_Location VARCHAR2(10),
Orig_Ord_No VARCHAR2(30),
Field_G VARCHAR2(30),
Line_No VARCHAR2(10),
POS_UPC VARCHAR2(30),
Item_Descr VARCHAR2(80),
Ord_Qty VARCHAR2(10),
Line_Status VARCHAR2(30),
Report_Date VARCHAR2(30),
Ship_Type VARCHAR2(30),
ERR_FLAG VARCHAR2(10),
ERR_LOG VARCHAR2(800)
)
ORGANIZATION EXTERNAL
(type oracle_loader
default directory WORK_DIR
access parameters
(records delimited by NEWLINE
skip 1
fields terminated by '',''
optionally enclosed by ''"''
missing FIELD VALUES are NULL)
location ('''||each_record.filename||''')
)
reject limit unlimited';
Execute Immediate 'Grant All on database.my_table to USER';
* merge statement goes here*
End Loop;
commit;
end;
同樣,這個想法是,每到這個運行時,它會得到的CSV文件中新的列表中dir_list表與Java程序get_dir_list,然後對每個文件名時我設置爲等於變量,並使用外部表加載器中的變量來加載文件。
我運行到[S] 2個[/ s]的問題
編輯:好吧,讓下面光標的行標識的修正,現在我打哪裏,當我去第二次通過點我光標看起來是錯的或丟失了 - 如果唯一的動作是做put_line,它會經過一個循環。但是在那裏執行立即聲明,例如「全部授予」,那麼只要它完成一次傳遞,它就會在循環的頂部拋出ORA-08103並拒絕繼續。
3)我知道在這個問題上(https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:37593123416931),說要使用alter table命令。然而,當我嘗試它不接受我的那個
execute immediate 'alter table database.my_table location('''||filename||''')';
嘗試拋出了一個錯誤(加上我仍然需要得到它做另一個循環有沒有把這個名字當前文件的進外部裝載機)
任何建議或幫助?我應該注意到,我們在windows而不是unix(因爲人們在這些地方提供的大多數解決方案都假設爲後者),並且由於批准限制(因爲這似乎是另一個常見問題),所以我不能抓住另一個程序或模塊來完成這項工作解決方案)
謝謝!
那麼,錯誤是什麼? – OldProgrammer
對於第一點,錯誤是PLS-00382:表達式類型錯誤。對於第2點沒有錯誤消息,它只是掛起執行,直到你終止進程 – user6004930
而對於第3點,改變「拋出一個錯誤」?我猜這也是PLS-00382出於同樣的原因。 –