之前项目运维人员碰到一个问题,需要写一个存储过程,把数据导出为csv文件,查了一些资料,帮他写成了一个PLSQL,今天拿出来分享一下,不足之处,欢迎指教。

数据背景:  用到两张表,一张存放单位组织名称org_name,它只有一个字段org_name;一张存放要导出的具体数据ryxx,其中ryxx这张表有一个字段是org_name中的org_name字段(需要like '%org_name%')。(表因为一些原因不能贴出来,见谅)

目标需求:  要求根据单位组织名称即org_name,分批导出ryxx数据为csv文件,并且导出的文件最大不能超过30000行,文件名为单位组织名称后跟序号

所用知识:  PLSQL语法,包括游标、循环、条件等语句,CSV文件导出语法

具体实现:

  --1、创建要导出文件的存放地址的变量

  CREATE OR REPLACE DIRECTORY mydir AS 'D:\sjdc';

  --2、PLSQL开始

  DECLARE

    -- 定义游标 org 用于获取组织名称

    CURSOR org IS SELECT org_name FROM org_name;

    -- 定义组织名 org_name, 接收组织名

    org_name VARCHAR2(40);

    -- 定义组织名相似匹配(用于 LIKE 查询)

    org_name_like VARCHAR(40);

    -- 定义总量,接收每次根据组织名称查询时 ryxx 表中匹配的数据总量

    count_number NUMBER;

    -- 定义每个组织名称关联的数据需要循环次数(因为每次导出只能导出30000条数据,需要多次导出)

    loop_times NUMBER;

    -- 定义当前循环到第几次(同上)

    loop_i NUMBER;

    -- 定义根据 org_name 匹配查询出的具体数据,为SYS_REFCURSOR类型,即动态游标

    data_cur SYS_REFCURSOR;

    -- 定义匹配查询出的具体数据的总量(同上)

    count_cur SYS_REFCURSOR;

    -- 定义文件输出

    csv_output UTL_FILE.FILE_TYPE;

    -- 定义 ryxx 的行类型

    data_row ryxx%ROWTYPE;

    -- 每个文件导出的最大行数

    MAX_LINE NUMBER := 30000;

    -- 输出位置

    dir VARCHAR(20) := 'MYDIR';

  -- 函数体开始

  BEGIN

    -- 1、打开 org 游标,获取组织名称,挨个取出名称进行操作

    OPEN org;

      LOOP

        --  2、循环取出组织名称,当无数据时推出循环

        FETCH org INTO org_name;

        EXIT WHEN org%NOTFOUND;

        -- 3、拼接相似查询的 org_name_like,两边都有%

        org_name_like := '%' || org_name || '%';

        -- 4、打开游标 count_cur, 查询对应的单位名称下的 ryxx 总量

        OPEN count_cur FOR 'SELECT COUNT(*) FROM ryxx WHERE st_code_name like :org_name_like' USING org_name_like;

          FETCH count_cur INTO count_number;

        CLOSE count_cur;

        -- 5、 计算此单位的数据总共需要导出几次

        loop_times := count_number/MAX_LINE;

        -- 6、 开始循环导出数据

        loop_i := 0;

        LOOP

          -- 退出循环条件:当前循环次数大于总共要循环的次数

          EXIT WHEN loop_i > loop_times;

          

          IF loop_i <= loop_times THEN

            -- 7、打开查询数据的data_cur游标,导出数据(需要分页查询,所以外层不能直接用*,否则不能把数据放入data_row)

            OPEN data_cur FOR 'SELECT id, name, age FROM

                (SELECT t.*, rownum rn FROM ryxx WHERE ST_CODE_NAME LIKE :org_name_like)

                WHERE rn <= ' || TO_CHAR((loop_i) * MAX_LINE) || ' AND rn > ' || TO_CHAR(loop_i * MAX_LINE) USING org_name_like;

              csv_output := UTL_FILE.FOPEN('MYDIR', org_name || loop_i || '.csv', 'W', MAX_LINE);

              LOOP

                FETCH data_cur INTO data_row;

                EXIT WHEN data_cur%NOTFOUND;

                UTL_FILE.PUT_LINE(CSV_OUTPUT, data_row.id || ',' || data_row.name || ',' || data_row.age);

              END LOOP;

              loop_i := loop_i + i;

              UTL_FILE.FCLOSE(csv_output);

            CLOSE data_cur;

          END IF;          

        END LOOP;

      END LOOP;

    CLOSE org;

  END;

  /

Oracle PLSQL数据导出csv的案例的更多相关文章

  1. C#将DataTable数据导出CSV文件

    C#将DataTable数据导出CSV文件通用方法! //导出按钮调用导出方法    protected void btnCSV_Click(object sender, EventArgs e)   ...

  2. PHP 将MySQL数据导出csv

    1.查询数据 // 假设得到的数据格式如下 $result = array( array( "orderid" = "1110111", "shopi ...

  3. 很多人都没用过的轻量级Oracle数据库数据导出工具SQLLDR2——性能超赞

    SQLLDR2 介绍 每周发表一篇数据库或大数据相关的帖子,敬请关注 1. 工具介绍 Sqluldr2(SQL * UnLoader 第二版)是灵活与强大的 Oracle 文本导出程序,已被大众使 用 ...

  4. 使用springboot和easypoi进行的数据导出的小案例

    在这个案例中使用的有springboot和easypoi进行数据导出到excel中 yml文件是这样的: server: port: 8080 spring: datasource: url: jdb ...

  5. 彻底理解使用JavaScript 将Json数据导出CSV文件

    前言 将数据报表导出,是web数据报告展示常用的附带功能.通常这种功能都是用后端开发人员编写的.今天我们主要讲的是直接通过前端js将数据导出Excel的CSV格式的文件. 原理 首先在本地用Excel ...

  6. oracle数据库数据导出和导入

    oracle的客户端里面的bin下面有两个可执行文件,名称分别为exp.exe和imp.exe. 他俩的用途就是导出和导入数据用的. 全库 导出:exp 用户名/密码@数据库名 full=y file ...

  7. 数据库数据导出CSV文件,浏览器下载

    直接上代码: def download(request): # 从数据库查询数据 data_list = Info.objects.all() # 定义返回对象 response = HttpResp ...

  8. DataTable数据导出CSV文件

    public static void SaveAsExcel(DataTable dt1) { //System.Windows.Forms.SaveFileDialog sfd = new Syst ...

  9. 将远程mysql服务器数据导出 csv 并发送到我的本机

    1.在SQL上执行查询并导出操作 '; 2.发送到本机 SQL>system sz idIsNull2.csv;

随机推荐

  1. 剑指offer:序列化二叉树

    题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树 思路分析: 这里一开始有点不明白题目的意思.实际上序列化应该指把二叉树用某种编码方式表示,这里一般是字符串的形式.而反序列就是将之前生成的序 ...

  2. npm install WARN package.json not exists

    npm install WARN package.json not exists: D:\ProData\package.json 一.总结 一句话总结: 出现这样的原因一般是没有切换到指定的目录下, ...

  3. 如何查看android studio sdk路径配置

    file–>Other Settings–>Default Project Structure

  4. Twitter雪花算法SnowFlake算法的java实现

    https://juejin.im/post/5c75132f51882562276c5065 package javaDemo; /** * twitter的snowflake算法 -- java实 ...

  5. ios 打包相关的那些报错

    这张图片是因为打包bitcode的时候出现了失败,重新打包即可 这个是因为电脑容量不足导致的无法启动模拟器,这个经常发生在128g的电脑并且同时开启多个模拟器的情况下 打完包后,苹果会给你发邮件告诉你 ...

  6. copy函数是有返回值的!

    用 copy() 函数来删除开头的元素: a = []int{1, 2, 3} a = a[:copy(a, a[1:])] // 删除开头1个元素 a = a[:copy(a, a[N:])] // ...

  7. python工程设置工具(pipenv)

    原始安装 pip工具 --- 包安装工具, 可以从Python包索引hub上安装,也可以使用自定义的hub. 命令: pip install xxx 缺点: 1.命令方式, 一次只能安装一个包, 对于 ...

  8. Java8 lambda表达式10个示例<转>

    例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例.看一下Java 8之前的runna ...

  9. EF Core使用遇到的问题

    目录 EF Core速度问题 问题描述 EF使用方法1,每一行存储一次(400条/s) EF使用方法2,链接不释放 (40条/s) EF使用方法3,多次add,一次SaveChanges(400条/s ...

  10. VC++ 学习笔记(六):简单C++

    到现在,我觉得终于找到学习和使用C++的基本原则了——务必简单.将其看成一个带类的C,或者将其看做标准库下的C++. C++太复杂——其实这种复杂性,所有语言都有,只是多数语言都隐藏了这种复杂性,只有 ...