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