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');
相关推荐
聚美智数2 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
瀚高PG实验室2 小时前
瀚高数据库常用系统表查询入门指南(附常用SQL)
数据库·sql·postgresql·瀚高数据库
ben9518chen2 小时前
mysql数据库基本操作
数据库·mysql
2603_965148112 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
土豆.exe3 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
缓慢更新3 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
Web3&Basketball5 小时前
实测Gemini4Argon:ERQA 87%登顶长程任务榜
数据库·python·大模型·多模态·gemini·长上下文·推理优化
xiaogai_gai5 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
注塑机数据采集联网5 小时前
注塑机数据采集网关对接MES系统数字化技术方案
大数据·网络·数据库·物联网·数据挖掘·数据分析
像风一样自由20206 小时前
56.实战PostgreSQL-pgvector-FastAPI构建轻量级RAG
数据库·人工智能·postgresql·大模型·fastapi·智能体