Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带缓冲区的oracle utl文件_Oracle_Performance_Optimization_Plsql_Utl File - Fatal编程技术网

带缓冲区的oracle 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 如

我读过关于调优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
如您所见,在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;