lightdb sql*loader兼容oracle实现

    SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中。ORACLE SQL*LOADER有特有的数据文件、控制文件、命令行参数格式,并且只能导入到oracle数据库。lightdb sql*loader可以兼容ORACLE SQL*LOADER数据文件等格式,将数据导入到lightdb数据库。

 1、系统交互

 总体架构为 C/S 模式,控制文件和数据文件以及 LTLDR 都存储在客户端服务器上,LTLDR 解析 LOAD DATA 控制文件,并按照控制文件中的规则读取导入数据文件,对其中的列进行处理转换,还可以按照指定规则进行记录的过滤。通过 libpq 库调用 COPY 接口,将处理之后的数据和 COPY 指令传递到服务端;

2、命令行

要显示列出所有ltldr参数以及每个参数的简要描述和默认值的帮助屏幕,请在提示符处输入ltldr --help,然后按enter键。

兼容 sqlldr 的选项:

  • --control : 控制文件名(即默认的 -c--config;
  • --log : 日志文件名(即默认的 -L--logfile;
  • --data : 数据文件名;
  • --discard : 废弃文件名;
  • --discardmax : 允许废弃的文件的数目(默认无限制);
  • --skip : 要跳过的逻辑记录的数目 (默认 0)(即默认的 -F--from);
  • --load : 要加载的逻辑记录的数目 (默认全部)(即默认的 -C--count);

连接选项(保持和 ltsql 一致):

  • -h, --host=HOSTNAME
  • -p, --port=PORT
  • -U, --username=USERNAME
  • -w, --no-password
  • -W, --password

3、控制文件语法

[ OPTIONS  ( option [ , ... )  ]

LOAD DATA

[ CHARACTERSET  charset ]

INFILE  'filename'  [ "STR 'char'" ]  [ "FIX count" ]

[ BADFILE  'filename' ]

[ DISCARDFILE  'filename' ]

[ APPEND  |  INSERT  |  TRUNCATE ]

INTO TABLE tablename

[ WHEN  condition ]

[ FIELDS  TERMINATED  BY 'char' ]

[ [ OPTIONALLY ENCLOSED  BY 'char' ]

[ TRAILING NULLCOLS ]

col [ , ... ]  )

OPTIONSLOAD DATA作为控制文件中语法的两部分。

LOAD DATA中可以有CHARACTERSET、文件(infile\badfile\discardfile)、导入方法、into子句等组成部分。

文件(infile\badfile\discardfile)可以有一个或者多个。

into子句可以有一个或者多个。

控制文件中的注释

注释可以出现在文件参数部分的任何位置,但不应出现在数据中。

在任何注释前加上两个连字符,例如:

--This is a comment

忽略双连字符右侧的所有文本,直到行尾。

在控制文件中指定命令行参数

可以使用OPTIONS子句在ltldr控制文件中指定命令行参数。

如果您经常使用具有相同选项集的控制文件,这可能很有用。OPTIONS子句位于LOAD DATA语句之前。

OPTIONS子句

可以使用OPTIONS子句指定以下命令行参数。

连接参数,应用于控制文件中的OPTIONS (...)

OPTIONS (...)中支持的选项

  • log : 日志文件名
  • bad : 错误文件名(计划支持)
  • data : 数据文件名
  • discard : 废弃文件名
  • discardmax : 允许废弃的文件的数目(全部默认)(计划支持)
  • skip : 要跳过的逻辑记录的数目 (默认 0)
  • load : 要加载的逻辑记录的数目 (默认全部)

指定数据文件

使用INFILE关键字,后跟导入数据文件名和可选的文件处理选项字符串。

语法如下

数据在控制文件中

INFILE 'c:/topdir/subdir/datafile.dat'

指定数据文件格式

配置ltldr时,可以在控制文件中指定依赖于操作系统的文件处理选项字符串(os_file_oc_clause),以指定文件格式

INFILE 'mydata.dat' "RECSIZE 80"

注意:此示例使用推荐的惯例:文件名使用单引号

实际运用中,使用sqluldr生成的控制文件中会初始fix关键字表示一条记录的长度。需增加fix表示记录的用法。

处理不同的字符编码模式

输入字符转换

  1. CHARACTERSET参数

指定CHARACTERSET参数告诉SQL*Loader输入数据文件的字符集。

如果未指定CHARACTERSET参数,则所有数据文件的默认字符集是NLS_LANG参数定义的会话字符集。

可以使用CHARACTERSET参数指定输入数据文件中使用的字符集。

ltldr可以自动将数据从数据文件字符集转换为数据库字符集或数据库国家字符集(如果它们不同)。

当需要转换数据字符集时,目标字符集应该是源数据文件字符集的超集。

CHARACTERSET语法如下:

CHARACTERSET char_set_name

用CHARACTERSET参数指定的字符集不适用于控制文件中用INFILE子句指定的数据。始终使用NLS_LANG参数为会话指定的字符集处理控制文件。因此,要在NLS_LANG参数为会话指定的字符集以外的字符集中加载数据,必须将数据放在单独的数据文件中。

ltldr默认 UFT-8

  1. 控制文件字符集

LANG是针对Linux系统的语言、地区、字符集的设置。

NLS_LANG是针对Oracle语言、地区、字符集的设置。

控制文件本身假定位于通过NLS_LANG参数为会话指定的字符集中。

如果控制文件字符集与数据文件字符集不同,请记住以下问题。在ltldr控制文件中指定为字符串的分隔符和比较子句值将在进行任何比较之前从控制文件字符集转换为数据文件字符集。为了确保规范正确,您可能更喜欢指定十六进制字符串,而不是字符串值。

如果十六进制字符串与UTF-16 Unicode编码中的数据文件一起使用,那么字节顺序在大端系统和小端系统上是不同的。例如,在大端系统上,UTF-16中的“,”(逗号)是X'002c'。在小端序系统中,它是X'2c00'。ltldr要求您始终以大端格式指定十六进制字符串。如果需要,ltldr在进行比较之前交换字节。这允许在big endianlittle endian系统的控制文件中使用相同的语法。

UTF-16 Unicode编码中的流格式数据文件的记录终止符在UTF-16中默认为“\n”(即,大端系统为0x000A,小端系统为0x0A00)。您可以使用INFILE行上的“STR'char_STR'”或“STR x'hex_STR'”规范覆盖这些默认设置。例如,您可以使用以下任一选项指定“ab”用作记录终止符,而不是“\n”。

表级别的导入方式

表级别的导入方式会覆盖总体的导入方式。总体导入方式默认是INSERT,除非在into table子句前有其他指定。

空表:

INSERT,则查询表是否为空,为空才能继续导入

非空表:

APPEND,追加方式导入数据

REPLACE,使用delete语句删除表中数据,再导入数据(不支持)

TRUNCATE,删除表格后创建表格,再导入数据

LightdboracleREPLACETRUNCATE语义正好相反。Lightdb中的TRUNCATE实际意义是oracle中的REPLACE

根据条件导入行

通过使用WHEN子句测试记录中的条件,可以选择加载或丢弃逻辑记录。

WHEN子句出现在表名之后,后跟一个或多个字段条件。field_condition的语法如下:

下面这个子句中,任何第五个字符等于"q"的行都要被导入

WHEN (5) = 'q'

WHEN子句可以包含多个比较,前提是每个比较前面都是AND。括号是可选的,但为了清楚起见,应使用由AND连接的多个比较。例如:

WHEN (deptno = '10') AND (job = 'SALES')

指定默认数据分隔符

如果数据文件中的所有数据字段都以类似方式终止,则可以使用fields子句指示默认终止符和包围分隔符。

处理缺少数据的短记录

当控制文件定义为记录指定的字段多于记录中存在的字段时,SQL*Loader必须确定是否应将剩余(指定的)列视为空或是否应生成错误。

如果控制文件定义明确指出字段的起始位置超出逻辑记录的结尾,则SQL*Loader始终将该字段定义为空。如果用相对位置定义了字段(如下面的示例中的dname和loc),并且记录在找到字段之前结束,则SQL*Loader可以将该字段视为空或生成错误。SQL*Loader使用TRALING NULLCOLS子句的存在或不存在(如以下语法图所示)来确定操作过程。

TRAILING NULLCOLS 子句

TRAILING NULLCOLS子句告诉SQL*Loader将记录中不存在的任何相对定位的列视为空列。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值