今天遇到一个客户找我处理一个小问题,主要是按条件导出数据表报错,这里记录一下如何处理的。

expdp 直接带查询条件语句可能出现的情况

直接在导出命令里写QUERY=<查询SQL>来按条件导出数据表可能会报这些错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
--错误1
LRM-00101: unknown parameter name 'empno'
--错误2
ORA-39001: invalid argument value
ORA-39035: Data filter SUBQUERY has already been specified
--错误3
ORA-31693: Table data object "SCOTT"."DEPT" failed to load/unload and is being skipped due to error:
ORA-00933: SQL command not properly ended
--错误4
LRM-00111: no closing quote for value ''
EXP-19: failed to process parameters, type 'EXP HELP=Y' for help
EXP-0: Export terminated unsuccessfully
--错误5
ORA-31693: Table data object "SCOTT"."DEPT" failed to load/unload and is being skipped due to error:
ORA-06502: PL/SQL: numeric or value error
ORA-31605: the following was returned from LpxXSLSetTextVar in routine kuxslSetParam:
LPX-314: an internal failure occurred
--错误6
...
Processing object type TABLE_EXPORT/TABLE/TABLE
ORA-31693: Table data object "<SCHEMA_NAME>"."<TABLE_NAME>" failed to load/unload and is being skipped due
to error:
ORA-00911: invalid character

大部分的原因为是因为涉及到特殊字符需要转义,如果没有加转义符号\可能就会报错,但是万一是个复杂SQL还要到处去转义一下比较麻烦。

解决办法

把相关的参数写到配置文件里,expdp直接调用文件即可。

比如我要导出某张表里指定时间内的数据,并且每个文件30G大小,示例如下:

oracle用户在当前目录创建文件 query.par,内容如下:

1
2
3
4
5
6
DIRECTORY=DATA_PUMP_DIR
DUMPFILE=2024_%U
LOGFILE=2024.log
filesize=30000M
tables=TABLE_01
QUERY=TABLE_01:"where to_char(time,'YYYY-MM-DD hh:mi')>='2024-01-01 00:00'and to_char(time,'YYYY-MM-DD hh:mi')<='2024-12-31 23:59'"

执行,手动输入密码即可。

1
expdp parfile=query.par

结束

不是啥新知识点,不总干数据库的活,手生,现学现用,记录一下。

更多示例参考Export/Import DataPump Parameter QUERY - How to Specify a Query (Doc ID 277010.1)

欢迎联系我一起讨论。我的微信号:Eric_xu_2023

也欢迎关注我的公众号:

1.png