使用 Oracle Datapump API 实现数据导出

简介:   Oracle Datapump API 是基于PL/SQL实现的,是命令行方式下的补充。使用Datapump API可以将其逻辑备份特性将其集成到应用程序当中,基于界面来实现有利于简化其管理。

  Oracle Datapump API 是基于PL/SQL实现的,是命令行方式下的补充。使用Datapump API可以将其逻辑备份特性将其集成到应用程序当中,
基于界面来实现有利于简化其管理。本文主要描述的使用Datapump API描述各种不同情形的数据导出。

一、演示使用datapump api实现数据导出

--1、导出schema(schema模式)

	DECLARE
	   l_dp_handle        NUMBER;
	   l_last_job_state   VARCHAR2 (30) := 'UNDEFINED';
	   l_job_state        VARCHAR2 (30) := 'UNDEFINED';
	   l_sts              KU$STATUS;
	BEGIN
	   --sepcified operation,job mode
	   l_dp_handle :=
	      DBMS_DATAPUMP.open (operation     => 'EXPORT'
	                        , job_mode      => 'SCHEMA'     
	                        , remote_link   => NULL
	                        , job_name      => 'JOB_EXP1'
	                        , version       => 'LATEST');
	   --specified dumpfile and dump directory
	   DBMS_DATAPUMP.
	    add_file (handle      => l_dp_handle
	            , filename    => 'scott_schema.dmp'
	            , directory   => 'DB_DUMP_DIR'
	            , filetype    => DBMS_DATAPUMP.KU$FILE_TYPE_DUMP_FILE);
	   --specified log file and dump directory
	   DBMS_DATAPUMP.
	    add_file (handle      => l_dp_handle
	            , filename    => 'scott_schema.log'
	            , directory   => 'DB_DUMP_DIR'
	            , filetype    => DBMS_DATAPUMP.KU$FILE_TYPE_LOG_FILE);
	   --specified fliter for schema
	   DBMS_DATAPUMP.
	    metadata_filter (handle   => l_dp_handle
	                   , name     => 'SCHEMA_EXPR'
	                   , VALUE    => 'IN (''SCOTT'')');
	   DBMS_DATAPUMP.start_job (l_dp_handle);
	   DBMS_DATAPUMP.detach (l_dp_handle);
	END;
	/

--2、导出特定表table(表模式)

	DECLARE
	   l_dp_handle        NUMBER;
	   l_last_job_state   VARCHAR2 (30) := 'UNDEFINED';
	   l_job_state        VARCHAR2 (30) := 'UNDEFINED';
	   l_sts              KU$STATUS;
	BEGIN
	   l_dp_handle :=
	      DBMS_DATAPUMP.open (operation     => 'EXPORT'
	                        , job_mode      => 'TABLE'
	                        , remote_link   => NULL
	                        , job_name      => 'JOB_EXP2'
	                        , version       => 'LATEST');
	   DBMS_DATAPUMP.
	    add_file (handle      => l_dp_handle
	            , filename    => 'emp_tbl.dmp'
	            , directory   => 'DB_DUMP_DIR'
	            , filetype    => DBMS_DATAPUMP.KU$FILE_TYPE_DUMP_FILE);
	   DBMS_DATAPUMP.
	    add_file (handle      => l_dp_handle
	            , filename    => 'emp_tbl.log'
	            , directory   => 'DB_DUMP_DIR'
	            , filetype    => DBMS_DATAPUMP.KU$FILE_TYPE_LOG_FILE);
	   -->如果非当前帐户,使用下面的过滤条件,即特定schema下的特定表,如为当前帐户,此过滤条件可省略
	   DBMS_DATAPUMP.
	    metadata_filter (handle   => l_dp_handle
	                   , name     => 'SCHEMA_EXPR'
	                   , VALUE    => 'IN(''SCOTT'')');
	   DBMS_DATAPUMP.
	    metadata_filter (handle   => l_dp_handle
	                   , name     => 'NAME_EXPR'
	                   , VALUE    => 'IN(''EMP'')');
	   DBMS_DATAPUMP.start_job (l_dp_handle);
	   DBMS_DATAPUMP.detach (l_dp_handle);
	END;
	/

--3、导出schema并过滤掉特定表(使用非当前帐户导出时应过滤schema)

	DECLARE
	   l_dp_handle   NUMBER;
	BEGIN
	   l_dp_handle :=
	      DBMS_DATAPUMP.open (operation => 'EXPORT', job_mode => 'SCHEMA');
	   DBMS_DATAPUMP.
	    add_file (handle      => l_dp_handle
	            , filename    => 'scott_filter.dmp'
	            , directory   => 'DB_DUMP_DIR'
	            , filetype    => DBMS_DATAPUMP.KU$FILE_TYPE_DUMP_FILE);
	   DBMS_DATAPUMP.
	    add_file (handle      => l_dp_handle
	            , filename    => 'scott_filter.log'
	            , directory   => 'DB_DUMP_DIR'
	            , filetype    => DBMS_DATAPUMP.KU$FILE_TYPE_LOG_FILE);
	   DBMS_DATAPUMP.
	    metadata_filter (handle   => l_dp_handle
	                   , name     => 'SCHEMA_LIST'
	                   , VALUE    => ' ''SCOTT'' ');
	   DBMS_DATAPUMP.metadata_filter (handle        => l_dp_handle
	                                , name          => 'NAME_EXPR'
	                                , VALUE         => ' !=''EMP'' '
	                                , object_type   => 'TABLE');
	   DBMS_DATAPUMP.start_job (l_dp_handle);
	END;
	/

--4、导出当前schema下的所有表并过滤特定表

	DECLARE
	   l_dp_handle   NUMBER;
	BEGIN
	   l_dp_handle :=
	      DBMS_DATAPUMP.open (operation => 'EXPORT', job_mode => 'TABLE');
	   DBMS_DATAPUMP.
	    add_file (handle      => l_dp_handle
	            , filename    => 'scott_filter_2.dmp'
	            , directory   => 'DB_DUMP_DIR'
	            , filetype    => DBMS_DATAPUMP.KU$FILE_TYPE_DUMP_FILE);
	   DBMS_DATAPUMP.
	    add_file (handle      => l_dp_handle
	            , filename    => 'scott_filter_2.log'
	            , directory   => 'DB_DUMP_DIR'
	            , filetype    => DBMS_DATAPUMP.KU$FILE_TYPE_LOG_FILE);
	   DBMS_DATAPUMP.metadata_filter (handle        => l_dp_handle
	                                , name          => 'NAME_EXPR'
	                                , VALUE         => ' !=''EMP'' ');
	   DBMS_DATAPUMP.metadata_filter (handle        => l_dp_handle
	                                , name          => 'NAME_EXPR'
	                                , VALUE         => ' !=''DEPT'' ');
	   DBMS_DATAPUMP.start_job (l_dp_handle);
	   DBMS_DATAPUMP.detach (l_dp_handle);
	END;
	/

--5、批量过滤当前用户下的特定表

	DECLARE
	   l_dp_handle   NUMBER;
	BEGIN
	   l_dp_handle :=
	      DBMS_DATAPUMP.open (operation => 'EXPORT', job_mode => 'TABLE');
	   DBMS_DATAPUMP.
	    add_file (handle      => l_dp_handle
	            , filename    => 'scott_filter_3.dmp'
	            , directory   => 'DB_DUMP_DIR'
	            , filetype    => DBMS_DATAPUMP.KU$FILE_TYPE_DUMP_FILE);
	   DBMS_DATAPUMP.
	    add_file (handle      => l_dp_handle
	            , filename    => 'scott_filter_3.log'
	            , directory   => 'DB_DUMP_DIR'
	            , filetype    => DBMS_DATAPUMP.KU$FILE_TYPE_LOG_FILE);
	   DBMS_DATAPUMP.metadata_filter (handle        => l_dp_handle
	                                , name          => 'NAME_EXPR'
	                                , VALUE         => ' NOT LIKE ''T%'' ');
	   DBMS_DATAPUMP.start_job (l_dp_handle);
	   DBMS_DATAPUMP.detach (l_dp_handle);
	END;
	/
	
	/**************************************************/
	/* Author: Robinson Cheng                         */
	/* Blog:   http://blog.csdn.net/robinson_0612     */
	/* MSN:    robinson_0612@hotmail.com              */
	/* QQ:     645746311                              */
	/**************************************************/
--6、过滤特定表上的特定行
--现在表tb_emp上HIREDATE为日期型,需要按日期进行过滤
	scott@CNMMBO> desc tb_emp
	 Name                                      Null?    Type
	 ----------------------------------------- -------- ----------------------------
	 EMPNO                                              NUMBER(4)
	 ENAME                                              VARCHAR2(10)
	 JOB                                                VARCHAR2(9)
	 MGR                                                NUMBER(4)
	 HIREDATE                                           VARCHAR2(10)
	 SAL                                                NUMBER(7,2)
	 COMM                                               NUMBER(7,2)
	 DEPTNO                                             NUMBER(2)
	
	scott@CNMMBO> select empno,ename,hiredate from tb_emp;
	
	     EMPNO ENAME      HIREDATE
	---------- ---------- ----------
	      9999 Ro.Ch
	      7369 SMITH      19801217
	      7499 ALLEN      19810220
	      7521 WARD       19810222
	      7566 JONES      19810402
	      7654 MARTIN     19810928
	      7698 BLAKE      19810501
	      7782 CLARK      19810609
	      7788 SCOTT      19870419
	      7839 KING       19811117
	      7844 TURNER     19810908
	      7876 ADAMS      19870523
	      7900 JAMES      19811203
	      7902 FORD       19811203
	      7934 MILLER     19820123
	
	15 rows selected.
	scott@CNMMBO> select count(*) from tb_emp where hiredate>='19810311';
	
	  COUNT(*)
	----------
	        11
	    
	DECLARE
	   l_dp_handle   NUMBER;
	BEGIN
	   l_dp_handle :=
	      DBMS_DATAPUMP.open (operation => 'EXPORT', job_mode => 'TABLE');
	   dbms_datapump.
	    add_file (handle      => l_dp_handle
	            , filename    => 'scott_tb_emp.dmp'
	            , directory   => 'DB_DUMP_DIR'
	            , filetype    => DBMS_DATAPUMP.KU$file_type_dump_file);
	   dbms_datapump.
	    add_file (handle      => l_dp_handle
	            , filename    => 'scott_tb_emp.log'
	            , directory   => 'DB_DUMP_DIR'
	            , filetype    => DBMS_DATAPUMP.KU$file_type_log_file);
	   DBMS_DATAPUMP.metadata_filter (handle        => l_dp_handle
	                                , name          => 'NAME_EXPR'
	                                , VALUE         => ' =''TB_EMP'' '
	                                , object_type   => 'TABLE');
	 DBMS_DATAPUMP.data_filter( handle       => l_dp_handle
	                            , name         => 'SUBQUERY'
	                            , VALUE        => 'WHERE HIREDATE >=''19810311'''
	                            , table_name   => 'TB_EMP' );                                
	   DBMS_DATAPUMP.start_job (l_dp_handle);
	   DBMS_DATAPUMP.detach (l_dp_handle);
	END;
	/
	/*
	oracle@SZDB:/u02/database/CNMMBO/BNR/dump> more scott_tb_emp.log
	Starting "SCOTT"."SYS_EXPORT_TABLE_01":  
	Estimate in progress using BLOCKS method...
	Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
	Total estimation using BLOCKS method: 64 KB
	Processing object type TABLE_EXPORT/TABLE/TABLE
	Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
	. . exported "SCOTT"."TB_EMP"                            7.695 KB      11 rows
	Master table "SCOTT"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
	******************************************************************************
	Dump file set for SCOTT.SYS_EXPORT_TABLE_01 is:
	  /u02/database/CNMMBO/BNR/dump/scott_tb_emp.dmp
	Job "SCOTT"."SYS_EXPORT_TABLE_01" successfully completed at 17:33:23 */

--7、批量过滤特定表上的特定行
--将下面的代码包含在PL/SQL块中,使用游标循环来传递需要过滤的表的名字从而生成多个过滤条件
--下面的PL/SQL块中所有包含ARC字符的表上的特定日期v_split_date的记录才能被导出
	FOR tab_cur IN (SELECT table_name, num_rows
	                  FROM dba_tables
	                 WHERE table_name LIKE '%ARC%' AND owner='GOEX_ADMIN')
	LOOP
	   dbms_datapump.
	    data_filter (
	      handle       => hand,
	      name         => 'SUBQUERY',
	      VALUE        => 'WHERE BUSINESS_DATE >= ''' || v_split_date || '''',
	      table_name   => '' || tab_cur.table_name || '');
	END LOOP;

--8、错误处理
--如果定义了job_name则经常会碰到下列错误,如果未指定job_name则有系统自动生成job_name,并由系统自动管理job_name

	DECLARE
	*
	ERROR at line 1:
	ORA-31634: job already exists
	ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
	ORA-06512: at "SYS.DBMS_DATAPUMP", line 911
	ORA-06512: at "SYS.DBMS_DATAPUMP", line 4354
	ORA-06512: at line 7
	
	scott@CNMMBO> ho oerr ora 31634
	/*
	31634, 00000, "job already exists"
	// *Cause:  Job creation or restart failed because a job having the selected  
	//          name is currently executing.  This also generally indicates that
	//          a Master Table with that job name exists in the user schema.  Refer
	//          to any following error messages for clarification.
	// *Action: Select a different job name, or stop the currently executing job  
	//          and re-try the operation (may require a DROP on the Master Table).  */
	
	scott@CNMMBO> select table_name from user_tables where table_name like 'JOB%';
	
	TABLE_NAME
	------------------------------
	JOB_EXP
	
	scott@CNMMBO> drop table job_exp;
	drop table job_exp
	           *
	ERROR at line 1:
	ORA-00054: resource busy and acquire with NOWAIT specified
	
	scott@CNMMBO> SELECT DISTINCT    object_name
	  2                  || '   '
	  3                  || locked_mode
	  4                  || '   '
	  5                  || ctime
	  6                  || '   '
	  7                  || c.SID
	  8                  || '  '
	  9                  || serial#
	 10             FROM v$locked_object a, dba_objects b, v$lock c, v$session d
	 11            WHERE a.object_id = b.object_id
	 12              AND c.SID = a.session_id
	 13              AND c.SID = d.SID;
	
	OBJECT_NAME||''||LOCKED_MODE||''||CTIME||''||C.SID||''||SERIAL# 
	-----------------------------------------------------------------------
	JOB_EXP   3   552   1075  799
	
	scott@CNMMBO> alter system kill session '1075,799';
	
	System altered.
	
	scott@CNMMBO> drop table job_exp purge;   -->删除表之后再次进行导出
	
	Table dropped.  

9、使用视图监控datapump状态
	scott@CNMMBO> col owner_name format a15
	scott@CNMMBO> col operation format a15
	scott@CNMMBO> col state format a20
	scott@CNMMBO> select owner_name,job_name,operation,job_mode,state,degree from dba_datapump_jobs;
	
	OWNER_NAME      JOB_NAME        OPERATION       JOB_MODE   STATE                    DEGREE
	--------------- --------------- --------------- ---------- -------------------- ----------
	SCOTT           JOB_EXP1        EXPORT          SCHEMA     EXECUTING                     1

10、使用下面的过程设定并行度
	DBMS_DATAPUMP.set_parallel (hand, 1);
		
11、上述操作所在的演示环境
	scott@CNMMBO> select * from v$version where rownum<2;
	
	BANNER
	----------------------------------------------------------------
	Oracle Database 10g Release 10.2.0.3.0 - 64bit Production

二、几点注意事项
1、使用schema模式导出时,如果导出的schema为当前schema,则不需要指定schema过滤条件,否则需要对schema进行过滤
2、使用table表模式导出时,如果导出的表为当前schema,则不需要指定schema过滤条件,否则需要对schema进行过滤
3、对于过滤表上的特定记录可以使用多种SQL表达式,如 LIKE, NOT LIKE,IN, NOT IN, = , != 符号等
4、需要注意单引号的使用,尤其是在字符型的数据类型时,两个单引号代表一个引号
5、如果在导出时存在同样的dump文件和日志文件时PL/SQL块将执行失败,删除或通过写PL/SQL来判断文件是否存在,如存在是否覆盖等
6、如果指定了job_name,则当前job失败之后,再次执行时会碰到job已经存在的提示,建议让系统自动生成job_name简化管理

三、更多参考

数据泵 EXPDP 导出工具的使用

数据泵 IMPDP 导入工具的使用

expdp impdp中 exclude/include 的使用

http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_datpmp.htm
https://forums.oracle.com/forums/thread.jspa?threadID=837324
http://psoug.org/reference/dbms_datapump.html

 

目录
相关文章
|
16天前
|
存储 人工智能 API
AgentScope:阿里开源多智能体低代码开发平台,支持一键导出源码、多种模型API和本地模型部署
AgentScope是阿里巴巴集团开源的多智能体开发平台,旨在帮助开发者轻松构建和部署多智能体应用。该平台提供分布式支持,内置多种模型API和本地模型部署选项,支持多模态数据处理。
142 4
AgentScope:阿里开源多智能体低代码开发平台,支持一键导出源码、多种模型API和本地模型部署
|
2天前
|
监控 API 数据处理
速卖通商品数据尽在掌握:揭秘高效利用API接口获取详情策略
速卖通(AliExpress)API助力电商数据处理与分析,提供商品搜索、价格监控等功能。开发者需注册账号、创建应用并获取API Key。常用接口包括商品搜索和详情API。调用时注意频率限制、数据延迟及错误处理。本文介绍全过程并附Python示例代码,帮助提升电商运营效率。
|
15天前
|
数据采集 数据可视化 前端开发
怎么通过API获取电竞赛事实时数据
选择合适的电竞数据API是开发电竞应用的关键。主流API包括OP.GG、Liquipedia、Stratz、Riot Games和熊猫比分,涵盖LOL、DOTA2等游戏的实时数据。注册并获取API密钥后,需仔细阅读文档,了解资源、请求方法、必需参数及响应格式。编写代码调用API时,注意优化请求频率,避免封禁。最后,通过Web界面或可视化工具展示数据,如React/D3.js、Tableau等。示例代码展示了如何使用熊猫比分API获取即将开始的比赛信息。
|
12天前
|
供应链 监控 API
1688.item_search_shop API:开启电商数据新纪元
1688.item_search_shop API是阿里巴巴1688平台提供的核心接口之一,支持根据关键词搜索指定店铺的商品,并获取商品详情、图片、价格等信息。该API允许设定搜索结果排序方式,如按销量或价格排序,满足不同需求。开发者可将其集成到电商应用中,提升用户体验;市场分析人员可利用其进行趋势和竞争对手分析;供应链管理人员则能监控库存,优化策略。示例代码展示了如何使用Python调用该API,帮助开发者快速上手。这一API的推出标志着B2B电商领域商品搜索技术的重要进步,推动行业向更高效、智能的方向发展。
|
22天前
|
数据采集 监控 数据挖掘
常用电商商品数据API接口(item get)概述,数据分析以及上货
电商商品数据API接口(item get)是电商平台上用于提供商品详细信息的接口。这些接口允许开发者或系统以编程方式获取商品的详细信息,包括但不限于商品的标题、价格、库存、图片、销量、规格参数、用户评价等。这些信息对于电商业务来说至关重要,是商品数据分析、价格监控、上货策略制定等工作的基础。
|
2月前
|
API 网络安全
发送UDP数据免费API接口教程
此API用于向指定主机发送UDP数据,支持POST或GET请求。需提供用户ID、密钥、接收IP及端口、数据内容等参数。返回状态码和信息提示。示例中含公共ID与KEY,建议使用个人凭证以提高调用频率。
50 13
|
2月前
|
网络协议 API 网络安全
发送TCP数据免费API接口教程
此API用于向指定主机发送TCP数据,支持POST/GET请求,需提供用户ID、KEY、接收IP、端口及数据内容。返回状态码和信息提示,示例如下:{&quot;code&quot;:200,&quot;msg&quot;:&quot;发送成功!&quot;}。详情见:https://www.apihz.cn/api/datacstcp.html
45 11
|
2月前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle的还原数据
Oracle数据库中的还原数据(也称为undo数据或撤销数据)存储在还原表空间中,主要用于支持查询的一致性读取、实现闪回技术和恢复失败的事务。文章通过示例详细介绍了还原数据的工作原理和应用场景。
【赵渝强老师】Oracle的还原数据
|
2月前
|
人工智能 关系型数据库 MySQL
数据魔力,一触即发 —— Dataphin数据服务API,百炼插件新星降临!
本文通过一个利用百炼大模型平台和Dataphin数据服务API构建一个客户360智能应用的案例,介绍如何使用Dataphin数据服务API在百炼平台创建一个自定义插件,用于智能应用的开发,提升企业智能化应用水平。
159 3
数据魔力,一触即发 —— Dataphin数据服务API,百炼插件新星降临!
|
2月前
|
API 数据安全/隐私保护 开发者
实时获取小红书详情 API 数据
小红书详情API数据获取指南:注册开发者账号,创建应用并申请接口权限,构建请求获取笔记详情,使用Python等语言处理响应数据。需遵守使用规则,注意调用频率和数据安全。

推荐镜像

更多