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');
相关推荐
小林熬夜学编程30 分钟前
【MySQL】第十一弹---复合查询全攻略:多表、自连接、子查询与合并查询
android·linux·开发语言·数据库·mysql·算法
qq_13948428821 小时前
springboot417-基于Spring Boot的酒店后台管理系统(源码+数据库+纯前后端分离+部署讲解等)
java·数据库·spring boot·后端·spring·maven·intellij-idea
m0_748254091 小时前
【MySQL 的数据目录】
数据库·mysql·adb
m0_748234901 小时前
【MySQL】表的基本操作
数据库·mysql·oracle
若云止水2 小时前
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_t
数据库·nginx·ubuntu
hzj62 小时前
极简Redis速成学习
数据库·redis·学习
m0_748248232 小时前
SpringBoot集成Flink-CDC,实现对数据库数据的监听
数据库·spring boot·flink
小猪咪piggy2 小时前
【MySQL】(1) 数据库基础
数据库·mysql
青云交3 小时前
大数据新视界 -- 大数据大厂之 Hive 函数库:丰富函数助力数据处理(上)(11/ 30)
大数据·数据库·sql·数据处理·自定义函数·函数分类·常用函数·hive 函数库
kunkun_12303 小时前
django app中的models迁移问题根治方法
数据库·django