【问题标题】:How to save result of query in csv file in client machine in oracle?如何将查询结果保存在oracle客户端机器的csv文件中?
【发布时间】:2021-11-02 10:17:03
【问题描述】:

我在连接到服务器数据库的客户端计算机上编写查询。 有时我需要加入一些巨大的表,所以我无法一次获得全部输出,我在循环中运行我的查询以获取较小部分的数据(例如每个城市代码),然后聚合数据。 有时查询需要运行几个小时,这会导致查询的执行中断。 我的问题是: 有没有办法在我的查询中将每个部分的结果添加到 csv 文件中,所以如果我的查询中断,我会为剩余部分运行它?

数据库是 oracle,我使用 toad for oracle 来运行我的查询。

这是我的查询的简化形式:

DECLARE 
TYPE br_data IS RECORD (brnchcod NUMBER, c100 NUMBER);
TYPE result IS TABLE OF br_data INDEX BY BINARY_INTEGER;
bd br_data; 
rs result;
begin
     for cur_br in (select a.ABRNCHCOD from Afbranches a)
     loop
         Select 
             Br.ABRNCHCOD, Sum(K.CARD100)
         INTO bd
         From Afbranches Br
         Left Join 
         K
         On Br.ABRNCHCOD=K.ABRNCHCOD
         where Br.ABRNCHCOD = cur_br.ABRNCHCOD
         Group by Br.ABRNCHCOD;
         rs(rs.COUNT) := bd;
     end loop;
    dbms_output.put_line(bd.c100);
end;

【问题讨论】:

  • 你需要了解一些东西。如果运行 PLSQL 块,数据库可以创建 csv,但只能在服务器中。 (例如,使用 UTL_FILE )。但是,如果要在客户端创建 csv,则必须更改逻辑并改用 SQL。我会在sqlplus 中使用 shell 脚本应用一些逻辑(每个分支)。它并不复杂,可以从客户端执行

标签: oracle for-loop export-to-csv


【解决方案1】:

dbms_output.put_line 将您传递的字符串添加到服务器上的一个数组中(在您会话的私有区域中)。您的工具最后应该读取这个数组并打印它的内容。这就是像 sqlplus 这样的工具所做的。

现在,如果您的查询返回太多行,则此数组可能会超出会话内存的限制,并且您的连接可能会中断,通常会给您一个错误。有时网络会在不通知您的情况下中断您的会话(例如,某些防火墙的规则允许它们中断几分钟后不活动的连接)。 正如第一个评论者所说,您最好只使用一条 SQL 语句并将行假脱机到一个文件中。

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 2021-05-01
    • 2017-10-04
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多