带缓冲区的oracle utl文件
我读过关于调优UTL_文件的文章 从技术上讲,这种方法是在大小小于缓冲区的最大长度时连接记录,在长度大于最大长度时写入整个缓冲区 网站摘录(代码): 问题是,我得到了带缓冲区的oracle utl文件,oracle,performance,optimization,plsql,utl-file,Oracle,Performance,Optimization,Plsql,Utl File,我读过关于调优UTL_文件的文章 从技术上讲,这种方法是在大小小于缓冲区的最大长度时连接记录,在长度大于最大长度时写入整个缓冲区 网站摘录(代码): 问题是,我得到了 1,user1 2,user2 3,user3 4,user4 5, user5 6,user6 7,user7 8,user8 9,user9 10,user10 11,user11 12,user12 13,user13 14, user14 15,user15 16,user16 17,user17 18,user19 如
1,user1
2,user2
3,user3
4,user4
5,
user5
6,user6
7,user7
8,user8
9,user9
10,user10
11,user11
12,user12
13,user13
14,
user14
15,user15
16,user16
17,user17
18,user19
如您所见,在4条记录之后,缓冲区是“满”的,因此它将改为写入
缓冲区是user14,而不是写在同一行上
谢谢问题不在于您的功能本身,而是您在通话后进行的测试:
if l_buffer is NOT NULL then
UTL_FILE.PUT_LINE(l_file, l_buffer);
l_buffer := NULL;
end if;
l\u缓冲区始终填充,它从不为空。因此,测试始终为true,并为表中的每一行写入文件。您需要测试l_buffer
的长度,并且仅在长度大于您的限制时写入
但不要只是改变测试。您需要取消选中FN\u GET\u BUFFER()
的逻辑,将缓冲区填充和刷新包含在单个子例程中,否则将丢失数据。大概是这样的:
FOR rec IN cur_table
LOOP
l_rec := CONVERT(rec.id || ',' || rec.user ,'AL32UTF8');
IF LENGTH(l_buffer) + LENGTH(C_CHRLEN) + LENGTH(l_rec) > C_MAXLEN THEN
-- buffer full, write to file
UTL_FILE.PUT_LINE(l_file, l_buffer);
l_buffer := l_rec;
ELSIF LENGTH(l_buffer) = 0 THEN
-- first record
l_buffer := l_rec;
ELSE
-- buffer not full
l_buffer := _l_buffer || C_CHRLEN || l_rec;
END IF;
END LOOP rec;
if LENGTH(l_buffer) > 0 THEN
-- end of table, write last record
UTL_FILE.PUT_LINE(l_file, l_buffer);
end if;
警告未经测试的编码野生风格使用过程,而不是PUT_LINE
-甚至可以用UTF8编写文本。
1,user1
2,user2
3,user3
4,user4
5,
user5
6,user6
7,user7
8,user8
9,user9
10,user10
11,user11
12,user12
13,user13
14,
user14
15,user15
16,user16
17,user17
18,user19
if l_buffer is NOT NULL then
UTL_FILE.PUT_LINE(l_file, l_buffer);
l_buffer := NULL;
end if;
FOR rec IN cur_table
LOOP
l_rec := CONVERT(rec.id || ',' || rec.user ,'AL32UTF8');
IF LENGTH(l_buffer) + LENGTH(C_CHRLEN) + LENGTH(l_rec) > C_MAXLEN THEN
-- buffer full, write to file
UTL_FILE.PUT_LINE(l_file, l_buffer);
l_buffer := l_rec;
ELSIF LENGTH(l_buffer) = 0 THEN
-- first record
l_buffer := l_rec;
ELSE
-- buffer not full
l_buffer := _l_buffer || C_CHRLEN || l_rec;
END IF;
END LOOP rec;
if LENGTH(l_buffer) > 0 THEN
-- end of table, write last record
UTL_FILE.PUT_LINE(l_file, l_buffer);
end if;