利用PL/SQL从Oracle数据库导出和导入数据

下面是“利用PL/SQL从Oracle数据库导出和导入数据”的完整攻略。

1. PL/SQL的介绍

PL/SQL是面向对象的程序设计语言,用于与Oracle数据库进行交互。PL/SQL具有结构化编程的能力,可以编写存储过程和触发器等程序对象。

2. 导出数据的基本步骤

导出数据是从数据库中把数据取出来并保存到本地文件中。PL/SQL提供了dbms_datapump这个包来实现数据的导出和导入。

下面是导出数据的基本步骤:

(1)连接到Oracle数据库,并打开PL/SQL开发工具,例如SQL Developer。

(2)运行以下代码创建一个数据泵作业:

DECLARE
  dp_handle  NUMBER;
BEGIN
  dp_handle := DBMS_DATAPUMP.OPEN(operation => 'EXPORT', job_mode => 'FULL', job_name => 'EXPORT_JOB', version => 'COMPATIBLE');
  DBMS_DATAPUMP.ADD_FILE(dp_handle, 'EXPORT.LOG', 'LOG');
  DBMS_DATAPUMP.ADD_FILE(dp_handle, 'EXPORT.DMP', 'DMP');
  DBMS_DATAPUMP.METADATA_FILTER(dp_handle, 'SCHEMA_EXPR', 'IN (''SCHEMA_NAME'')');
  DBMS_DATAPUMP.DATA_FILTER(dp_handle, 'INCLUDE', 'TABLE', 'IN (''TABLE_NAME'')');
  DBMS_DATAPUMP.START_JOB(dp_handle);
  DBMS_DATAPUMP.WAIT_FOR_JOB(dp_handle);
  DBMS_DATAPUMP.DETACH(dp_handle);
END;
/

其中,SCHEMA_NAME和TABLE_NAME需要替换为实际的模式名称和表名称。

执行该代码可以创建一个名称为EXPORT_JOB的导出作业,并将导出数据保存到EXPORT.DMP文件中。

3. 导入数据的基本步骤

导入数据是把之前导出的数据文件中的数据重新插入到数据库中。导入数据的步骤也可以使用dbms_datapump这个包来实现。

下面是导入数据的基本步骤:

(1)连接到Oracle数据库,并打开PL/SQL开发工具,例如SQL Developer。

(2)运行以下代码创建一个数据泵作业:

DECLARE
  dp_handle  NUMBER;
BEGIN
  dp_handle := DBMS_DATAPUMP.OPEN(operation => 'IMPORT', job_mode => 'FULL', job_name => 'IMPORT_JOB', version => 'COMPATIBLE');
  DBMS_DATAPUMP.ADD_FILE(dp_handle, 'IMPORT.LOG', 'LOG');
  DBMS_DATAPUMP.ADD_FILE(dp_handle, 'EXPORT.DMP', 'DMP');
  DBMS_DATAPUMP.METADATA_FILTER(dp_handle, 'SCHEMA_EXPR', 'IN (''SCHEMA_NAME'')');
  DBMS_DATAPUMP.DATA_FILTER(dp_handle, 'INCLUDE', 'TABLE', 'IN (''TABLE_NAME'')');
  DBMS_DATAPUMP.START_JOB(dp_handle);
  DBMS_DATAPUMP.WAIT_FOR_JOB(dp_handle);
  DBMS_DATAPUMP.DETACH(dp_handle);
END;
/

其中,SCHEMA_NAME和TABLE_NAME需要替换为实际的模式名称和表名称。需要注意的是,导入数据之前需要确保数据库中不存在相同的表。

执行该代码可以创建一个名称为IMPORT_JOB的导入作业,并从EXPORT.DMP文件中读取数据重新插入到数据库中。

4. 示例

假设有一个名为TEST的模式,其中包含一个名为EMP的表,我们需要导出该表的数据并保存到本地文件中,然后重新导入数据到另一个数据库中。下面给出两个示例说明。

示例1

导出数据:

DECLARE
  dp_handle  NUMBER;
BEGIN
  dp_handle := DBMS_DATAPUMP.OPEN(operation => 'EXPORT', job_mode => 'FULL', job_name => 'EXPORT_EMP', version => 'COMPATIBLE');
  DBMS_DATAPUMP.ADD_FILE(dp_handle, 'EXPORT_EMP.LOG', 'LOG');
  DBMS_DATAPUMP.ADD_FILE(dp_handle, 'EXPORT_EMP.DMP', 'DMP');
  DBMS_DATAPUMP.METADATA_FILTER(dp_handle, 'SCHEMA_EXPR', 'IN (''TEST'')');
  DBMS_DATAPUMP.DATA_FILTER(dp_handle, 'INCLUDE', 'TABLE', 'IN (''EMP'')');
  DBMS_DATAPUMP.START_JOB(dp_handle);
  DBMS_DATAPUMP.WAIT_FOR_JOB(dp_handle);
  DBMS_DATAPUMP.DETACH(dp_handle);
END;
/

执行该代码将导出TEST模式下的EMP表,并保存到EXPORT_EMP.DMP文件中。

导入数据:

DECLARE
  dp_handle  NUMBER;
BEGIN
  dp_handle := DBMS_DATAPUMP.OPEN(operation => 'IMPORT', job_mode => 'FULL', job_name => 'IMPORT_EMP', version => 'COMPATIBLE');
  DBMS_DATAPUMP.ADD_FILE(dp_handle, 'IMPORT_EMP.LOG', 'LOG');
  DBMS_DATAPUMP.ADD_FILE(dp_handle, 'EXPORT_EMP.DMP', 'DMP');
  DBMS_DATAPUMP.METADATA_FILTER(dp_handle, 'SCHEMA_EXPR', 'IN (''TEST'')');
  DBMS_DATAPUMP.DATA_FILTER(dp_handle, 'INCLUDE', 'TABLE', 'IN (''EMP'')');
  DBMS_DATAPUMP.START_JOB(dp_handle);
  DBMS_DATAPUMP.WAIT_FOR_JOB(dp_handle);
  DBMS_DATAPUMP.DETACH(dp_handle);
END;
/

执行该代码将从EXPORT_EMP.DMP文件中读取数据,并重新插入到数据库中。

示例2

假设现在需要把从EMP表中删除工资小于3000的记录,同时需要备份删除前的数据。具体步骤如下:

(1)备份数据

DECLARE
  dp_handle  NUMBER;
BEGIN
  dp_handle := DBMS_DATAPUMP.OPEN(operation => 'EXPORT', job_mode => 'FULL', job_name => 'EXPORT_EMP', version => 'COMPATIBLE');
  DBMS_DATAPUMP.ADD_FILE(dp_handle, 'EXPORT_EMP_BEFORE_DELETE.LOG', 'LOG');
  DBMS_DATAPUMP.ADD_FILE(dp_handle, 'EXPORT_EMP_BEFORE_DELETE.DMP', 'DMP');
  DBMS_DATAPUMP.METADATA_FILTER(dp_handle, 'SCHEMA_EXPR', 'IN (''TEST'')');
  DBMS_DATAPUMP.DATA_FILTER(dp_handle, 'INCLUDE', 'TABLE', 'IN (''EMP'')', 'QUERY_EXPR', 'WHERE SALARY < 3000');
  DBMS_DATAPUMP.START_JOB(dp_handle);
  DBMS_DATAPUMP.WAIT_FOR_JOB(dp_handle);
  DBMS_DATAPUMP.DETACH(dp_handle);
END;
/

执行该代码将导出工资小于3000的EMP表数据,并保存到EXPORT_EMP_BEFORE_DELETE.DMP文件中。

(2)删除数据

DELETE FROM TEST.EMP WHERE SALARY < 3000;
COMMIT;

执行该代码可以删除工资小于3000的EMP表记录,并进行数据库事务提交。

(3)重新导入数据

DECLARE
  dp_handle  NUMBER;
BEGIN
  dp_handle := DBMS_DATAPUMP.OPEN(operation => 'IMPORT', job_mode => 'FULL', job_name => 'IMPORT_EMP', version => 'COMPATIBLE');
  DBMS_DATAPUMP.ADD_FILE(dp_handle, 'IMPORT_EMP.LOG', 'LOG');
  DBMS_DATAPUMP.ADD_FILE(dp_handle, 'EXPORT_EMP_BEFORE_DELETE.DMP', 'DMP');
  DBMS_DATAPUMP.METADATA_FILTER(dp_handle, 'SCHEMA_EXPR', 'IN (''TEST'')');
  DBMS_DATAPUMP.DATA_FILTER(dp_handle, 'INCLUDE', 'TABLE', 'IN (''EMP'')');
  DBMS_DATAPUMP.START_JOB(dp_handle);
  DBMS_DATAPUMP.WAIT_FOR_JOB(dp_handle);
  DBMS_DATAPUMP.DETACH(dp_handle);
END;
/

执行该代码将从EXPORT_EMP_BEFORE_DELETE.DMP文件中读取数据,并重新插入到数据库中。

5. 结论

本文详细讲解了如何利用PL/SQL从Oracle数据库导出和导入数据,并给出了两个实际示例。通过这些示例,我们了解了PL/SQL的基本使用方法,并且掌握了如何使用PL/SQL来进行数据备份和恢复的操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用PL/SQL从Oracle数据库导出和导入数据 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • mysql数据库日志binlog保存时效问题(expire_logs_days)

    MySQL数据库中有一个重要的日志文件类型就是binlog(二进制日志),它记录了MySQL服务器所有的写操作,包括insert、update、delete等操作。但是由于二进制日志的文件会不断增大,占据服务器存储空间,因此我们需要对其进行管理,实现自动清理。 expire_logs_days是MySQL服务器参数之一,用于配置二进制日志文件的保存时间,即指…

    database 2023年5月22日
    00
  • mysql 5.6.17 绿色版(免安装)安装配置教程

    MySQL 5.6.17 绿色版(免安装)安装配置教程 下载MySQL 5.6.17 绿色版 首先需要从MySQL的官网下载MySQL 5.6.17绿色版的安装包,下载地址为:https://dev.mysql.com/downloads/mysql/5.6.html#downloads 选择对应的操作系统,下载zip压缩包。 解压MySQL 5.6.17 …

    database 2023年5月22日
    00
  • php执行sql语句的写法

    处理SQL语句是PHP中一个常见的任务,你可以使用不同的方法来执行SQL语句。本文将介绍在PHP中执行SQL语句的几种常见方法。 使用PDO PDO是PHP内置的访问数据库的扩展库,它支持各种各样的数据库,包括MySQL、PostgreSQL和Oracle等。使用PDO时,你不必编写针对特定数据库的代码,相反,你使用PDO提供的通用方法来执行SQL语句。 P…

    database 2023年5月21日
    00
  • MySQL Union合并查询数据及表别名、字段别名用法分析

    MySQL Union合并查询数据及表别名、字段别名用法分析 简介 MySQL的UNION语句可以将多条SELECT语句的结果集合并在一起,UNION语句必须满足以下要求: 多条SELECT语句返回的列数必须相同; 多条SELECT语句返回的列的数据类型必须兼容; UNION语句返回的结果集中,列的名称以第一条SELECT语句为准。 语法 SELECT co…

    database 2023年5月22日
    00
  • 结构化查询语言 (SQL) 和 Transact-SQL (T-SQL)的区别

    SQL和T-SQL都是常用的查询语言,在关系型数据库中非常常见。SQL是结构化查询语言(Structured Query Language)的缩写,T-SQL是SQL Server中的Transact-SQL的简称。下面来详细讲解两者之间的区别。 结构化查询语言(SQL) SQL是关系型数据库最基本的查询语言,用于处理关系型数据库中的数据。它的使用范围非常广…

    database 2023年3月27日
    00
  • Python使用LDAP做用户认证的方法

    关于 Python 使用 LDAP 进行用户认证的方法,我们可以分为以下几个步骤: 1. 安装 Python-ldap 模块 Python-ldap是一个Python包,它提供了对LDAP目录访问的接口。要安装它,可以使用 pip 命令: pip install python-ldap 如果你使用的是 Windows 操作系统,则还需要在安装完成之后,手动将…

    database 2023年5月22日
    00
  • mysql 索引过长1071-max key length is 767 byte

      原因 数据库表采用utf8编码,其中varchar(255)的column进行了唯一键索引 而mysql默认情况下单个列的索引不能超过767位(不同版本可能存在差异)   于是utf8字符编码下,255*3 byte 超过限制   解决 1  使用innodb引擎; 2  启用innodb_large_prefix选项,将约束项扩展至3072byte; …

    MySQL 2023年4月12日
    00
  • 使用JavaScript和MQTT开发物联网应用示例解析

    下面是关于“使用JavaScript和MQTT开发物联网应用示例解析”的完整攻略,以及其中的两个示例说明。 什么是MQTT MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅的消息协议,常用于物联网设备和服务器之间的通信。MQTT协议的特点在于轻量和易于使用。在MQTT中,客户端可以订阅某个主题,并收到与此…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部