exp 导出特殊表名

    群中有人提问:exp 导大小写混合的表名报错。

    建表语句如下:

   create table "aA" (c1 int);
    导出语句如下:
   exp  scott/tiger  tables="aA" ......

    报错:EXP-00011: SYS.AA 不存在

 

    看来,exp(11g win7)把表名进行转换了。转到sqlplus(11g linux32)中进行实验,create table "aA" (c1 int);和 create table aA(c1 int);可以同时创建成功,又可创建诸如create table "1234"(c1 int);的表。实际上Oracle对由""创建的表名会进行严格匹配,而普通的表名则要符合命名规范,在系统表中也是转换为大写再进行存储的。

    由此我想到是不是需要对表名的双引号进行转义,于是进行实验:

    exp  scott/tiger  tables=(sys."aA")......

    exp  scott/tiger  tables=(/"aA/").......
    exp  scott/tiger  tables=(/"sys.aA/")......

    均不能成功,改成下面的语句即可成功执行,注意模式名一定要加上,否则还是会转化为大写。

    exp  scott/tiger  tables=(sys./"aA/")......

    对"1234"进行实验,均可成功,或许是因为数字不需要进行大小写转换的原因吧。

    exp 'sys/orcl@orcl as sysdba' tables=(1234) file=c:/test.dmp;
    exp 'sys/orcl@orcl as sysdba' tables=("1234") file=c:/test.dmp;
<think>好的,我现在需要帮助用户找到如何通过Oracle进行批处理导出指定的方法或教程。用户提到了“批处理导出指定”,所以重点应该是如何批量导出特定的,并且可能需要自动化这个过程。 首先,我应该回忆一下Oracle常用的导出工具。最常用的应该是expexpdp。exp是传统导出工具,而expdp是数据泵导出,更高效但需要目录对象权限。用户的问题可能涉及到这两种工具,但用户提供的引用中提到了exp和bat脚本,所以可能需要用exp来实现。 接下来,用户希望批处理导出,也就是一次性导出多个,而不是手动一个个导出。这时候需要想办法在命令行中指定多个。根据引用[4]提到,exp不支持直接在tables参数中使用子查询,比如select语句,所以可能需要先生成,再拼接到命令中。 引用[5]提到了bat脚本,说明用户可能希望在Windows环境下使用批处理脚本来自动化导出。所以需要编写一个bat文件,里面包含导出命令,并且能够循环或指定多个。 然后,我需要考虑如何构造exp命令。exp的基本语法是exp user/password@db tables=(table1,table2,...) file=导出文件.dmp。但是当很多的时候,命令行可能会超过长度限制,这时候可能需要将存储在一个文件中,然后在bat脚本中读取并构造命令。 另外,引用[3]提到通过bat导出并过滤某些,可能涉及到读取配置文件中的,或者在SQL脚本中生成要导出。例如,可以先用SQL查询生成需要导出,保存到一个文本文件中,然后在bat脚本中读取这个文件,并构造exp命令。 可能的步骤是: 1. 创建一个包含所有需要导出的文本文件,比如table_list.txt,每行一个。 2. 编写bat脚本,读取这个文件,并将拼接成逗号分隔的字符串。 3. 使用exp命令,将这些作为tables参数的值,指定导出文件路径。 4. 处理可能出现的字符限制问题,比如过多导致命令行过长,这时候可能需要分批次导出。 不过,exptables参数是否支持很长的列?如果数量太多,可能会遇到问题。这时候可能需要分多个导出操作,或者改用数据泵expdp,它可能更灵活,但需要相应的目录权限。 但根据引用[4],用户尝试过用exptables参数,但发现不支持where子句。所以用户可能需要手动或通过脚本生成。 可能的示例步骤: - 使用SQL查询生成需要导出,例如select table_name from user_tables where ...条件,然后将结果保存到文件。 - 在bat脚本中读取该文件,并构造exp命令。 例如,在bat脚本中,可以调用sqlplus执行一个SQL脚本,将输出到文件,然后用for循环读取该文件,并构造参数。 但需要注意的是,exp命令在bat脚本中可能需要处理特殊字符,比如括号和逗号。例如,tables=(table1,table2,...)中的括号在bat脚本中可能需要转义。 此外,用户可能需要处理认证问题,比如在bat脚本中硬编码用户和密码,或者使用操作系统认证。但出于安全考虑,不建议在脚本中明文存储密码,所以可能需要使用其他方法,比如Oracle的wallet或者提示用户输入。 结合引用[2]和[5],用户可能希望自动化导出过程,使用bat脚本调用sqlplus或exp命令,并自动处理。 可能的解决方案: 1. 编写一个SQL脚本,生成要导出,保存到临时文件。 2. 编写bat脚本,读取该临时文件中的,并构造exp命令。 3. 执行exp命令导出指定的。 例如,假设有一个select.sql文件,内容为: select table_name from user_tables where ...条件; 然后通过sqlplus执行这个SQL脚本,将结果输出到table_list.txt,处理该文件,去掉首尾的无关信息,只保留,每行一个。 然后在bat脚本中,使用for循环读取table_list.txt中的每一行,将拼接成逗号分隔的字符串,然后调用exp命令。 但是,如果数量很大,拼接后的字符串可能会超过命令行长度限制。因此,可能需要分批次处理,或者改用参数文件。 另一种方法是使用数据泵expdp,它允许使用parfile参数,指定一个参数文件,其中包含tables的列。这可能更适合处理大量的情况。 例如,创建一个parfile.txt,内容为: tables=table1,table2,... directory=导出目录 dumpfile=导出文件.dmp 然后运行命令: expdp user/password@db parfile=parfile.txt 但用户可能需要先创建目录对象,并授权,这在引用中没有提到,但可能更高效。 不过用户提供的引用[1][2][3][4][5]中提到的都是exp和bat脚本,所以可能用户更倾向于使用传统exp工具,而不是数据泵。 综上所述,解决方案可能包括以下步骤: 1. 生成需要导出,可以通过SQL查询生成。 2. 编写bat脚本,读取该列并构造exp命令。 3. 执行exp命令导出指定的。 现在需要将这些步骤具体化,给出示例代码和说明,并注意LaTeX格式和引用。</think>### Oracle 批处理导出指定的方法步骤 #### 方法1:使用exp工具直接指定 ```bat @echo off set ORACLE_SID=your_sid set USER=your_user set PASSWORD=your_password exp %USER%/%PASSWORD%@%ORACLE_SID% tables=(table1,table2,table3) file=D:\export.dmp log=D:\export.log ``` **说明**: - `tables`参数支持同时指定多个,建议最多不超过50个以避免命令行超长[^4] - 导出文件路径需Oracle用户有写入权限 #### 方法2:通过SQL生成+批量导出 1. **生成文件** ```sql -- 保存为gen_tables.sql SET PAGESIZE 0 SET FEEDBACK OFF SPOOL tables.lst SELECT table_name FROM user_tables WHERE table_name LIKE 'TEMP_%'; SPOOL OFF EXIT ``` 2. **编写批处理脚本** ```bat @echo off sqlplus -s user/pwd@db @gen_tables.sql set /p TABLES=<tables.lst exp user/pwd@db tables=(%TABLES%) file=export.dmp ``` #### 方法3:使用数据泵expdp(推荐高效方式) ```bat expdp user/pwd DIRECTORY=DATA_PUMP_DIR DUMPFILE=export.dmp LOGFILE=export.log TABLES=table1,table2,table3 ``` **前置条件**: - 需创建目录对象并授权 ```sql CREATE DIRECTORY EXPORT_DIR AS '/u01/exports'; GRANT READ, WRITE ON DIRECTORY EXPORT_DIR TO user; ``` #### 方法4:动态过滤的进阶脚本 ```bat :: 导出排除ignoreTables.txt中指定的 for /f "delims=" %%i in ('sqlplus -s user/pwd@db @getTables.sql ^| findstr /V /G:ignoreTables.txt') do ( set TABLES=!TABLES!%%i, ) exp user/pwd@db tables=(%TABLES:~0,-1%) file=export.dmp ``` ```sql -- getTables.sql SET PAGESIZE 0 SELECT table_name FROM user_tables; EXIT ``` ### 注意事项 1. 使用exp工具时,若导出需要先执行`ALTER TABLE table_name ALLOCATE EXTENT` 2. Windows命令行最大长度限制为8191字符,超长列建议分批次导出[^5] 3. 生产环境建议使用数据泵expdp,支持更灵活的过滤和并行导出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值