利用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 一表字段逗号分隔对应另一表字段查询

    表一:login id cids state 1 1,2 1 表二:learn id name 1 zhangsan 2 lisi 3 wangwu   select g.id, GROUP_CONCAT(s.name) as sname from login g left join tlearn s on FIND_IN_SET(s.id, g.cids)…

    MySQL 2023年4月12日
    00
  • MongoDB排序时内存大小限制与创建索引的注意事项详解

    MongoDB是一款流行的非关系型数据库,它的排序操作牵涉到了内存限制和索引创建的注意事项。下面将从以下几个方面进行详细讲解。 内存大小限制 MongoDB中的排序操作需要将数据集加载到内存中,因此内存大小直接影响了排序操作的速度和成功率。准确地说,MongoDB中的排序操作内存大小限制实际上包含在两个参数中:sort_men和query_mem。 sort…

    database 2023年5月21日
    00
  • Redis中的数据过期策略详解

    Redis中的数据过期策略详解 Redis是一个快速的键-值存储系统,它被广泛应用于许多不同的应用程序中。Redis使用了多种数据过期策略,以便清除过期的键值对,以保证其内存占用不会无限增大。本文将会详细讲解Redis中的数据过期策略。 Redis中的数据过期策略 Redis中使用两种数据过期策略:惰性删除和定期删除。 2.1 惰性删除 当我们使用Redis…

    database 2023年5月22日
    00
  • oracle中 procedure(存储过程)和function(函数)本质区别

    Oracle 中 Procedure 和 Function 本质区别 在 Oracle 数据库中,Procedure 和 Function 都是存储过程的一种。但是它们有各自独特的特点和用途,下面详细讲解二者本质上的区别。 Procedure 1. 定义 Procedure 是一种存储程序,它是一组 SQL 语句和控制结构。它没有返回值,只负责完成一些操作,…

    database 2023年5月21日
    00
  • Oracle to_char函数的使用方法

    Oracle to_char函数的使用方法 to_char函数是Oracle内置函数之一,主要用于将日期、数值等数据类型转换为字符串类型。在Oracle数据库中,to_char函数具有广泛的应用场景,如在SELECT查询语句中使用,将日期格式化为不同的字符串格式;或者在创建视图、触发器等数据库对象时使用。 语法 下面是to_char函数的语法: to_cha…

    database 2023年5月21日
    00
  • sql server 2008 数据库管理系统使用SQL语句创建登录用户步骤详解

    下面我将详细讲解“SQL Server 2008 数据库管理系统使用SQL语句创建登录用户步骤详解”的完整攻略。 一、创建登陆账户的SQL语句格式 在SQL Server 2008中,创建登录账户的SQL语句格式如下: CREATE LOGIN 登录名 WITH PASSWORD = ‘登录密码’, DEFAULT_DATABASE = 默认数据库名, DE…

    database 2023年5月21日
    00
  • MongoDB MapReduce(数据处理)方法详解

    MongoDB MapReduce是一种数据处理技术,它允许您使用JavaScript编写MapReduce函数来对MongoDB集合中的数据进行聚合和分组。 下面是MongoDB MapReduce的完整使用放啊,包括过程和代码示例: 准备数据 首先,我们需要一些数据来演示MongoDB MapReduce。我们将使用以下JSON格式数据: { &quot…

    MongoDB 2023年3月14日
    00
  • mysql中event的用法详解

    Mysql中Event的用法详解 简介 MySQL中Event是一种与触发器类似的结构,但它们之间也有一些显著的区别。Event是在特定时间执行的一次性或重复性任务,这个时间可以是一段时间、一个日期、每天、每周、每月、每年的某一时间等。与之相比,触发器是在特定的数据修改事件(INSERT、UPDATE、DELETE)发生时自动触发。在变更数据时,它们都可以使…

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