当前位置: 首页 > article >正文

oracle使用PLSQL导出表数据

数据库课上布置了一个作业

利用PL/SQL语言,编写一个存储过程实现针对单张表的数据导出功能,要求将给定表的数据转换成SQL语言的Insert语句,并保存在文件中。该过程以要导出的表名和保存SQL语句的文件名为参数。

在网上尝试搜索了一下,中文网里没找到合适的参考文章,要么是针对特定表结构,要么是只导出特定数量的列,于是自己完成后写篇记录。

首先需要定义一个导出目录,这里定义了“EXPORT_DIR”

CREATE DIRECTORY EXPORT_DIR AS 'D:/';

然后创建存储过程,其中,BEGIN后的第一行有用到刚刚定义的导出目录,如果定义的导出目录与我不同,那么请修改这一行的导出目录。

 CREATE OR REPLACE PROCEDURE EXPORT_CONT(
p_table_name     VARCHAR2, -- table name
p_file_name     VARCHAR2 -- filename
)
AS
    l_cursor_handle  INTEGER;
    l_dummy              NUMBER;
    l_col_cnt          INTEGER;
    l_rec_tab            DBMS_SQL.DESC_TAB;
    l_current_col      NUMBER(16);
    l_current_line   VARCHAR2(2047);
    l_column_value   VARCHAR2(300);
    l_file_handle      UTL_FILE.FILE_TYPE;
    l_print_text       VARCHAR2(100);
    l_record_count   NUMBER(16) := 0;

    BEGIN
		    --------------- 如果定义的目录不是EXPORT_DIR,那么请修改这一行
        l_file_handle := UTL_FILE.FOPEN('EXPORT_DIR', p_file_name, 'a', 2047); 
        l_cursor_handle := DBMS_SQL.OPEN_CURSOR;
        DBMS_SQL.PARSE(l_cursor_handle, 'SELECT * FROM '|| p_table_name, DBMS_SQL.native);
        l_dummy := DBMS_SQL.EXECUTE(l_cursor_handle);
        DBMS_SQL.DESCRIBE_COLUMNS(l_cursor_handle, l_col_cnt, l_rec_tab); 
        l_current_col := l_rec_tab.FIRST;
        IF (l_current_col IS NOT NULL) THEN
            LOOP
                DBMS_SQL.DEFINE_COLUMN(l_cursor_handle, l_current_col, l_column_value, 300);
                l_current_col := l_rec_tab.NEXT(l_current_col);
                EXIT WHEN (l_current_col IS NULL);
            END LOOP;
        END IF;
        LOOP
            EXIT WHEN DBMS_SQL.FETCH_ROWS(l_cursor_handle) = 0; 

            l_current_line := 'INSERT INTO ' || p_table_name || ' VALUES (''';
            FOR l_current_col IN 1..l_col_cnt LOOP
                DBMS_SQL.COLUMN_VALUE (l_cursor_handle, l_current_col, l_column_value);
                l_print_text := l_column_value || ''',''';
                IF l_current_col =l_col_cnt
                then
                l_current_line := l_current_line || l_column_value || ''');';
                ELSE
                l_current_line := l_current_line || l_column_value || 
                ''',''';
                END IF;
            END LOOP;
            l_record_count := l_record_count + 1;
            UTL_FILE.PUT_LINE (l_file_handle, l_current_line);
        END LOOP;
        UTL_FILE.FCLOSE (l_file_handle);
        DBMS_SQL.CLOSE_CURSOR(l_cursor_handle);
    END;

运行存储过程(需要将第一个参数修改为自己想要导出的表名)。

call EXPORT_CONT('PROJECTS_110', 'proj.sql');

在导出目录下找到对应文件,确定内容确实为表的数据。

INSERT INTO PROJECTS_110 VALUES ('CXCY20231010','创新项目','校级','基于AI的智能诊断系统','8208220101','S001','5000','01-1月 -23','31-12月-23');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023001','创新项目','校级','基于AI的智能诊断系统','8208220101','S001','5000','01-1月 -23','31-12月-23');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023002','创业项目','省级','智能家居控制系统','8208220105','S001','12000','01-3月 -23','28-2月 -24');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023003','创新项目','国家级','新能源材料研究','8208220110','S001','25000','01-6月 -23','31-5月 -24');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023004','创业项目','校级','校园智能无人超市','8208220115','S001','8000','01-7月 -23','30-6月 -24');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023005','创新项目','省级','农业智能检测系统','8208220120','S001','15000','01-9月 -23','31-8月 -24');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023006','创新项目','校级','智能校园管理平台','8218220110','S002','6000','01-1月 -23','31-12月-23');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023007','创业项目','省级','电商平台优化系统','8218220115','S002','14000','01-2月 -23','31-1月 -24');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023008','创新项目','国家级','无人驾驶控制系统','8218220120','S002','30000','01-5月 -23','30-4月 -24');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023009','创业项目','校级','高效能太阳能发电板','8218220125','S002','10000','01-7月 -23','30-6月 -24');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023010','创新项目','省级','智慧交通管理系统','8218220129','S002','18000','01-9月 -23','31-8月 -24');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023011','创新项目','校级','AI驱动的医学影像分析','8228220101','S003','7000','01-1月 -23','31-12月-23');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023012','创业项目','省级','工业机器人优化系统','8228220105','S003','13000','01-3月 -23','29-2月 -24');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023013','创新项目','国家级','深度学习与计算机视觉研究','8228220110','S003','28000','01-6月 -23','31-5月 -24');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023014','创业项目','校级','虚拟现实教学系统','8228220115','S003','9000','01-7月 -23','30-6月 -24');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023015','创新项目','省级','智慧医疗平台','8228220120','S003','16000','01-9月 -23','31-8月 -24');
INSERT INTO PROJECTS_110 VALUES ('CXCY2023075','创新项目','省级','智慧医疗平台','8228220120','S003','16000','01-9月 -23','31-8月 -24');

http://www.kler.cn/a/567585.html

相关文章:

  • 【FL0087】基于SSM和微信小程序的民宿短租系统
  • Spring Boot 3 集成 RabbitMQ 实践指南
  • AnyDesk 远程桌面控制软件 v9.0.2
  • 数据结构之八大排序算法详解
  • QT基础十、表格组件:QTableWidget
  • JavaScript系列02-函数深入理解
  • 通过统计学视角解读机器学习:从贝叶斯到正则化
  • 华为在不同发展时期的战略选择(节选)
  • Java多线程与高并发专题——深入ReentrantReadWriteLock
  • Python 数据可视化(一)熟悉Matplotlib
  • iOS中的设计模式(六)- 单利模式
  • 问题解决:word导出的pdf图片不清晰?打印机导出的不是pdf,是.log文本文档?
  • 性能测试丨JMeter 分布式加压机制
  • uniapp 阿里云点播 播放bug
  • 目标检测——数据处理
  • 前端清除浮动有哪些方式?
  • 微服务即时通信系统---(七)文件管理子服务
  • 关于延迟任务线程池,Java提供的ScheduledThreadPoolExecutor,Spring提供的ThreadPoolTaskScheduler
  • flutter 专题 八十 Flutter 应用性能检测与优化
  • AUTOSAR整体架构与应用层详解和综合实例