gpt4 book ai didi

oracle - SQLPlus - 从 PL/SQL block 假脱机到多个文件

转载 作者:行者123 更新时间:2023-12-02 06:39:13 24 4
gpt4 key购买 nike

我有一个查询将大量数据返回到 CSV 文件中。事实上,行数太多,以至于 Excel 无法打开它。有没有办法控制 spool 每次处理 65000 行时假脱机到一个新文件?理想情况下,我希望将输出保存在按顺序命名的文件中,例如 large_data_1.csvlarge_data_2.csvlarge_data_3.csv等等...

我可以在 PL/SQL block 中使用 dbms_output 来控制输出多少行,但是我将如何切换文件,因为 spool 似乎不可以从 PL/SQL block 访问吗?

(Oracle 10g)

更新:

我无权访问服务器,因此将文件写入服务器可能不起作用。

更新2:

某些字段包含自由格式文本,包括换行符,因此在写入文件后计算换行符并不像在返回数据时计算记录那么容易...

最佳答案

找到了解决方案,不知道为什么我没有早点想到这个...

基本思想是主 sqplplus 脚本生成一个中间脚本,它将输出拆分为多个文件。执行中间脚本将执行对 rownum 施加不同范围的多个查询,并为每个查询假脱机到不同的文件。

set termout off
set serveroutput on
set echo off
set feedback off
variable v_rowCount number;
spool intermediate_file.sql
declare
i number := 0;
v_fileNum number := 1;
v_range_start number := 1;
v_range_end number := 1;
k_max_rows constant number := 65536;
begin
dbms_output.enable(10000);
select count(*)
into :v_err_count
from ...
/* You don't need to see the details of the query... */

while i <= :v_err_count loop

v_range_start := i+1;
if v_range_start <= :v_err_count then
i := i+k_max_rows;
v_range_end := i;

dbms_output.put_line('set colsep ,
set pagesize 0
set trimspool on
set headsep off
set feedback off
set echo off
set termout off
set linesize 4000
spool large_data_file_'||v_fileNum||'.csv
select data_string
from (select rownum rn, data_object
from
/* Details of query omitted */
)
where rn >= '||v_range_start||' and rn <= '||v_range_end||';
spool off');
v_fileNum := v_fileNum +1;
end if;
end loop;
end;
/
spool off
prompt executing intermediate file
@intermediate_file.sql;
set serveroutput off

关于oracle - SQLPlus - 从 PL/SQL block 假脱机到多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2630068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com