首页 > 其他分享 >本地机spool导出多个查询结果到多个CSV文件

本地机spool导出多个查询结果到多个CSV文件

时间:2024-09-03 15:49:09浏览次数:9  
标签:cityId 多个 XXX spool sql put array CSV line

问题

需要在PL/SQL developer 上多次手动重复查询导出大量数据。

解决

使用sqlcl中提供的SET SQLFORMAT csv和SQL plus提供的Spool导出数据到csv文件。

代码

set serveroutput on
set termout off
spool D:\SpoolFile\tmp_script.sql
DECLARE
    TYPE TYPE_ARRAY IS VARRAY(10) OF VARCHAR2(100);
    name_array TYPE_ARRAY := TYPE_ARRAY('01_XXX','02_XXX','03_XXX','04_XXX','05_XXX','06_XXX','07_XXX','08_XXX','09_XXX','10_XXX');  -- 导出数据的CSV文件命名数组
    var_array TYPE_ARRAY := TYPE_ARRAY('01','02','03','04','05','06','07','08','09','10'); -- 定义前2位编码的数组
    cityId VARCHAR2(2);
    v_sql varchar2(4000);
BEGIN
    -- 创建临时表
   for i IN 1..var_array.count
        LOOP
            cityId:=var_array(i);
            v_sql := 'CREATE GLOBAL TEMPORARY TABLE TMP_MX_'||cityId||' ON COMMIT PRESERVE ROWS  AS SELECT * FROM MX_M_VIEW WHERE p_view_param.set_cityId('''||cityId||''')='''||cityId||'''';  -- 把复杂的业务代码逻辑使用视图封装起来。这里是一个带参视图,放在循环里,然后循环传参,创建临时表,然后使用临时表导出数据。当然也可以直接使用视图导出数据,但是试了几次,导数会比较久。
            execute immediate v_sql;
        end loop;
		commit;

    -- 创建导出数据到文件的sql脚本
    for i IN 1..var_array.count loop
		cityId:=var_array(i);
        dbms_output.put_line('SET SQLFORMAT csv');
        dbms_output.put_line('SET FEEDBACK off');
        dbms_output.put_line('spool D:\SpoolFile\' ||name_array(i)|| '.csv'); -- 存放文件的路径不要带中文名
        DBMS_OUTPUT.put_line('SELECT * FROM TMP_MX_'||cityId||' ;');
        dbms_output.put_line('spool off');
        dbms_output.put_line('SET SQLFORMAT ansiconsole');
        dbms_output.put_line('SET FEEDBACK ON');
    end loop;
end;
/
spool off

@D:\SpoolFile\tmp_script.sql
HOST del D:\SpoolFile\tmp_script.sql

环境

Oracle Instant Client 版本

instantclient_11_2,下载了Basic, JDBC supplement, SQL *Plus, SDK, ODBC

sqlcl 版本

sqlcl-24.2.0.180.1721

java 版本

Oracle JDK11

关于使用UTL_FILE包

之前有尝试使用UTL_FILE包,但是一直在打开文件的步骤操作不成功。需要在数据库Oracle在的服务器创建文件夹,并不是在本地机上创建文件夹,但我目前只能远程操作。

参考资料

plsql - 假脱机多个文件 - 堆栈溢出 (stackoverflow.com)

oracle - SQL*Plus - Spool into multiple files - Stack Overflow

SPOOL sql语句实现LOOP循环转储多文件_oracle spool 生成多个文件-CSDN博客

标签:cityId,多个,XXX,spool,sql,put,array,CSV,line
From: https://www.cnblogs.com/a-Yogurt/p/18394744

相关文章

  • python 数据分析 损失数值 如何放到csv中呢 人工智能 深度神经网络,Pytorch ,tensorflo
    损失数值如何放到csv中呢 在Python中,使用`csv`模块将数据写入CSV文件是一种常见的操作。从你提供的代码片段来看,你想要将损失数值写入名为`middle_losse.csv`的文件中。但是,你提供的代码片段中存在一些需要修改的地方,以确保数据能够正确地写入CSV文件。首先,`csv.writer`对象的`wr......
  • JAVA List<Map<String, Object>> sort 多个排序写法
     基本方法/***排序=**@paramlist*@paramsort_key*@return*/publicstaticList<Map<String,Object>>sort(List<Map<String,Object>>list,Stringsort_key,Booleanasc,Stringsort_key2,Boole......
  • Scrapy:使用自定义列设置保存为 CSV 的指南
    在Scrapy中,你可以使用自定义列设置将数据保存为CSV文件。以下是一个基本的指南:定义你的数据项(Item):在你的Scrapy项目中,创建一个类来定义你要提取的数据项。每个数据项对应于CSV文件中的一列。处理数据:在你的爬虫(Spider)中,提取数据并将其存储在定义的数据项中。设置CSV输出:......
  • 比较 php 中的 CSV 行
    在PHP中,你可以使用内置的函数来比较CSV行。以下是一个示例代码,演示如何比较CSV行:<?php//读取CSV文件$file=fopen('your_file.csv','r');//初始化变量$previous_row=null;$current_row=null;//逐行读取CSV文件while(($data=fgetcsv($file))!==fals......
  • 国际SEO:如何为多个国家优化您的网站
    什么是国际SEO?国际SEO是指通过对网站进行优化,使其在不同地区和语言中同样能够在谷歌搜索中获得良好排名。这种策略对于那些目标客户分布在多个国家或语言的企业来说至关重要,涉及从网站结构调整以适应不同地区到内容定制以符合文化相关性和语言准确性的各种技术。国际SEO和本......
  • PostgreSQL -- 使用 Mybatis 时对数据库的多个删除操作
     在Java中使用Mybatis与PostgreSQL数据库进行交互时,删除操作的语句根据不同的场景应用不同。 1.删除表内所有记录删除表内所有的记录。谨慎使用!<!--1.删除表内所有记录--><deleteid="deleteALl">deletefromtable_name;</delete>2......
  • VBA代码解决方案第十七讲:如何选择一个工作表,如何选择多个工作表
    《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程,目前已经是第三版修订了。这套教程定位于入门后的提高,在学习这套教程过程中,侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码摆好。这套教程共三册,一百四十七讲,内容覆......
  • python并发与并行(四) ———— 用queue来协调多个线程之间的工作进度
    Python程序如果要同时执行多项任务,而这些任务又分别针对同一种产品的不同环节,那么就有可能得在它们之间进行协调。比较有用的一种协调方式是把函数拼接成管道。这样的管道与生产线比较像。它可以按先后顺序划分成几个阶段,每个阶段都由相应的函数负责。程序会把未经加工的原料放在生......
  • python并发与并行(三) ———— 利用Lock防止多个线程争用同一份数据
    了解到全局解释器锁(GIL)的效果之后,许多Python新手可能觉得没必要继续在代码里使用互斥锁(mutual-exclusionlock,mutex)了。既然GIL让Python线程没办法平行地运行在多个CPU核心上,那是不是就意味着它同时还会自动保护程序里面的数据结构,让我们不需要再加锁了?在列表与字典等结构上面测试......
  • 【漏洞分析】OSN 代币攻击事件:一笔资金伪造多个分红大户
    背景OSN是一种feeontransfer代币,会根据用户分红账户的余额对用户发放分红。攻击者利用漏洞增发分红账户的余额,随后触发分红机制完成获利。OSN:https://bscscan.com/address/0x810f4c6ae97bcc66da5ae6383cc31bd3670f6d13#code攻击由三笔交易组成:https://app.blocksec.com/......