如何为SQL Loader的CTL文件指定相对路径作为输入文件?
解决SQL Loader中INFILE相对路径指向错误的问题
这是个非常常见的SQL Loader路径陷阱,我之前处理数据导入时也踩过!核心原因是:SQL Loader默认会从你执行sqlldr命令的当前工作目录(也就是命令行窗口显示的路径)去查找INFILE指定的数据文件,而不是CTL配置文件所在的目录——哪怕你在CTL里写了相对路径,它也不会自动识别CTL的位置。
针对你的情况(CTL由SQL Developer自动生成,不想频繁修改它),给你几个实用的解决办法:
方法1:切换到CTL文件所在目录执行命令
这是最简单直接的方案:
- 打开命令行,用
cd命令切换到CTL文件所在的文件夹,比如:cd D:\your_path\ctl_folder - 然后在这个目录下执行sqlldr命令,比如:
sqlldr your_username/your_password@your_db control=your_loader.ctl
这样CTL里的INFILE 'AI_SLA_DATA_DATA_TABLE.ldr'就会相对于当前目录(也就是CTL所在目录)去查找数据文件,完全符合你的预期。
方法2:执行命令时用DATA参数覆盖CTL中的INFILE路径
如果你不想每次都切换目录,可以在调用sqlldr时直接指定数据文件的绝对路径,覆盖CTL里的配置:
sqlldr your_username/your_password@your_db control=D:\your_path\ctl_folder\your_loader.ctl data=D:\your_path\ctl_folder\AI_SLA_DATA_DATA_TABLE.ldr
这个方法的好处是不用修改SQL Developer自动生成的CTL文件,适合需要保留原CTL内容的场景。
方法3:修改CTL文件中的INFILE为绝对路径
如果你的数据文件位置固定,可以直接修改CTL里的INFILE配置为绝对路径,比如:
INFILE 'D:\your_path\ctl_folder\AI_SLA_DATA_DATA_TABLE.ldr'
不过这个方案的缺点是,一旦数据文件或CTL的位置变动,你就得重新修改CTL内容,不如前两种灵活。
补充说明
SQL Loader的这种路径逻辑是设计如此:它的工作目录依赖于启动时的命令行上下文,和CTL文件的存储位置无关。SQL Developer自动生成CTL时,默认使用相对路径是假设你会在CTL所在目录执行导入操作,所以才会出现你遇到的问题。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

