如何使用expdp导出未确定的Oracle模式

时间:2018-11-26 15:55:14

标签: oracle export expdp

我要导出Oracle数据库,但不导出完整且不确定的模式;例如名称为'IAS%'或名称为'YS%'

的架构

我写了这个命令:

Expdp admin/admin@orcl schemas like 'IAS%'  file=my_data.dmp directory=exp_dir 

但是我遇到错误:

  

无效的位置参数值“ like”

1 个答案:

答案 0 :(得分:0)

您将无法使用该命令运行导出。数据泵导出实用程序(EXPDP)不使用常规SQL。您不能在子句中使用简写SQL命令-子句必须根据Oracle文档进行定义。根据{{​​3}},EXPDP schemas子句的示例如下所示:

expdp hr DIRECTORY=dpump_dir1 DUMPFILE=expdat.dmp SCHEMAS=hr,sh,oe

它们具有以逗号分隔的值列出的架构,您必须执行类似的操作才能执行导出。您可以创建一个查询,该查询将以逗号分隔的格式返回所有这些模式,并简单地将该列表复制并粘贴到命令中,而不是尝试在命令本身中使用查询。

要获取该列表,您可以尝试运行以下查询:

select listagg(username,', ') within group(order by username) csv
  from all_users
  where username like 'IAS%';

此查询使用listagg documentation。如果使用的Oracle版本不支持listagg,则可以使用以下查询完成相同的操作。我在单独的function上找到了此查询,但它应该可以正常工作:

SELECT SUBSTR (SYS_CONNECT_BY_PATH (username , ','), 2) csv
      FROM (SELECT username , ROW_NUMBER () OVER (ORDER BY username ) rn,
                   COUNT (*) OVER () cnt
              FROM all_users where username like 'IAS%')
     WHERE rn = cnt
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1;

无论使用哪种查询,现在都将有一个以字符串'IAS'开头的逗号分隔模式列表。对于此示例,假设列表看起来像IAS_1, IAS_2, IAS_3,依此类推。然后您的命令将从以下位置更改:

Expdp admin/admin@orcl schemas like 'IAS%' file=my_data.dmp directory=exp_dir

更像是:

Expdp admin/admin@orcl schemas=IAS_1,IAS_2,IAS_3 file=my_data.dmp directory=exp_dir

如果在该数据库中经常创建和删除模式,则可以运行查询以更新受影响的模式列表,并手动复制和粘贴新列表。如果经常发生这种情况,则还可以创建一个动态SQL脚本来生成并执行EXPDP命令。

希望这会有所帮助!

有关数据泵的文档:StackOverflow question

有关listagg函数的文档: https://docs.oracle.com/cd/E11882_01/server.112/e22490/dp_export.htm#SUTIL200