0
我正試圖將表employees
中的員工名稱導出爲平面文件。該平面文件應具有以下結構:使用UTL_FILE在循環中將數據寫入平面文件
HEADER
DETAILS JACK
DETAILS JUNE
TRAILER
我所掙扎的是我怎麼能在一個循環中運行這個以單排的名字保存在同一文件中。我目前的腳本一次只能將一個名稱導出到單獨的文件中。由於文件名保持不變,因此每次執行過程時都會覆蓋文件。
請注意,如果可能,我希望將文件名作爲變量。
Create table Employees (Id number(10),Name varchar(40))
Insert into Employees values (1,'JOHN');
Insert into Employees values (2,'JACK');
Insert into Employees values (3,'JUNE');
-----------------------
CREATE OR REPLACE Procedure PRINT_NAMES(aId in Employees.Id%Type,
aFileName in varchar2)
Is
fDirectory varchar(30) := 'SB1KK_TEMP';
fName Employees.name%Type;
pFile Utl_File.file_type;
fLine Varchar2(1024);
Begin
pFile := UTL_FILE.fopen(fDirectory, aFileName, 'w');
--File Header
fLine := RPAD('HEADER', 10) || To_char(trunc(sysdate), 'yyyymmdd') || '000000';
UTL_FILE.put_line(pFile, convert(fLine, 'WE8ISO8859P1', 'UTF8'));
--File Details - This Section must be run in a loop
Select Name into fName From Employees where id = aId;
fLine := RPAD('DETAILS', 10) || RPAD(' ', 50) ||
To_char(trunc(sysdate), 'yyyymmdd') || RPAD(fName, 11);
UTL_FILE.put_line(pFile, convert(fLine, 'WE8ISO8859P1', 'UTF8'));
--File Trailer
fLine := RPAD('TRAILER', 10) || To_char(trunc(sysdate), 'yyyymmdd') || '000000';
UTL_FILE.put_line(pFile, convert(fLine, 'WE8ISO8859P1', 'UTF8'));
UTL_FILE.fclose(pFile);
End;
/
存儲過程運行在一個循環中。對於表employees
中的每個人,文件TMP_LOG.txt
被反覆創建。
Begin
For IDS in (Select * From Employees Where id in (2,3))
Loop
PRINT_NAMES(aId => IDS.ID, aFileName => 'TMP_LOG.TXT');
End Loop;
End;
謝謝Alex!正是我在找什麼。假設employees表擁有數千行。如何將它們傳遞給ID收集而無需列出單獨的EVRE? – MrM
@ user3651825 - 取決於您用來選擇它們的標準。你可以讓你的調用塊從查詢中填充一個集合,然後傳遞它。我已經添加了一個獲得相同行的演示,這更接近您原來的調用循環,但這隻有在您真的使用其他列選擇ID時纔有意義。 –
我將不得不閱讀關於集合和用戶定義的數據類型的使用。再次感謝!沒有更多的問題。 – MrM