SQL*Loader
是Oracle数据库系统提供的一个数据移植工具
它提供了一个命令行的方式
可以让用户成批的向Oracle数据库中装入大量数据
虽然Oracle数据库与SQL Server数据库都提供了图形界面的导入工具
但是
图形界面有一个很大的不足
就是不能够直接给前台程序引用
而命令行的导入模块
则可以直接被前台的应用程序所调用
这也是SQL*Loader之所以成为Oracle数据库系统最通用的工具之一的原因
SQL*Loader其具有如下的优势
一是可以直接被前台应用程序调用如开源的COMPIERE企业管理应用系统其就是采用Oracle的数据库系统在COMPIERE这个应用系统中有一项很强大的功能就是数据导入功能其不但可以按现有的模板导入数据而且用户还可以自定义导入的格式这对于系统在基础数据导入的时候非常的有用 但是其这个功能的开发确很简单因为其基本上都是直接调用后台数据库系统中的SQL*Loader模块命令行模式的导入模块可以直接被前台的应用程序调用这是其最大的优势
二是可以从既定文件中大量导入数据利用SQL*Loader工具可以从既定文件中如逗号分隔符文件或者固定宽度的文件把这些文件中的大量记录按照一定的规则导入到Oracle数据库系统中去这个导入的效率比图形界面来说也要高的多
三是可以实现把多个数据文件合并成一个文件我们都知道Oracle数据库中可以把一个数据库应用所需要的数据存放在多个数据文件中以追求比较高的数据库性能以及比价高的数据库安全性但是有时候我们也可能需要把这几个数据文件合二为一此时就可以采用SQL*Loader工具把它们进行合并
四是修复分离坏的记录有时候我们需要导入的数据跟Oracle数据库系统的数据表可能会存在一些沖突导致数据导入的失败如可能需要导入的数据字段太长超过了数据表的最大长度限制此时就会导致数据导入的失败利用SQL*Loader导入工具可以把这些不符合规则的记录分离出来存放在一个独立的文件中而符合规则的数据则可以被正常的导入如此的话就可以提高数据导入的准确性
下面我们来看看具体如何使用这个Oracle数据库系统为我们准备的好帮手
一般SQL*Loader模块至少需要两个文件才可以使用
一是数据文件数据文件顾名思义就是我们需要导入的数据集合对于Oracle系统来说其可以支持多个格式的数据文件如逗号分隔符或者TAB键分隔符或者分号分隔符等文本文件也支持固定宽度的文本文件等等不过在实际应用中用的最多的还是逗号分隔的文本文件
二是控制文件控制文件其起的作用就是建立数据文件与Oralce数据表字段之间的一一对应关系简单的说把数据文件中的某个内容放在Oracle数据表中的那个字段上这就是控制文件所起的主要作用
另外还有一个文件也非常有用叫做坏文件如果我们在命令行工具中指定了这个坏文件则导入过程中一些导入不成功的记录则会被保存在这个坏文件中所以对于数据库管理员来说这个文件有时候往往比数据导入日志文件更加的实用所以笔者建议若企业对于数据导入的准确性要求比较高的画则在使用SQL*Loader导入数据的时候最好能够指定这个坏文件这对于我们后续核对导入数据的准确性具有很大的实用价值
为了更好的使用这个导入工具笔者有如下建议
在制作数据文件的时候需要注意原有数据表的限制也就使说数据文件中的记录必须符合数据表的一些约束条件否则不符合条件的数据将无法被导入如需要考虑数据类型是否相符字段长度有没有超过限制有没有违反主键外键的约束等等只有符合这些约束的记录才能够被成功的导入否则的话数据将无法被成功装载为了避免这种情况笔者建议再利用这个工具的时候要指定坏文件只有如此数据库才能够再导入的过程中把一些失败的记录写到我们指定的文件中如此我们就可以通过调整然后把这些不符合规则的数据也装入到数据库中去
前台应用程序在设计基础数据导入功能的时候最好直接采用这个模块因为这个模块跟Oracle数据库集成的比较好能够最大限度的保障导入数据的准确性而且还可以节省很多前台的程序代码不过有点值得可惜的是SQL*Loader模块现在是Oracle数据库独享的应用模块也就是说只有在Oracle数据库平台上的应用程序才可以直接调用若一个应用程序支持多个数据库平台的时候则再设计这个数据导入功能的时候需要注意了这不像SQL语句那样的通用
在数据导入之前最好先最好相关的数据备份无论是采用图形化的数据导入工具还是采用命令行的数据导入工具有一个基本的原则大家必须遵守就使在成批导入数据之前必须先作好数据库的备份如此可以把数据导入错误的影响降至到最低
严格限制数据导入的权限虽然可以在后台数据库中限制SQL*Loader应用模块的使用权限不过最好还是能够在前台应用程序中加以控制如在前台应用程序中让其只有系统管理员才能够访问这个基础数据导入窗口等等因为数据库的访问权限在前台实现的话比较灵活而在后台固定死了的话前台系统权限设计往往会失去灵活性这是我们在数据库设计与前台应用程序设计的时候需要尽量避免的