怎样让Oracle每天把一个txt文件里记录的数据自动入库? (100分)

  • 主题发起人 主题发起人 wukw
  • 开始时间 开始时间
W

wukw

Unregistered / Unconfirmed
GUEST, unregistred user!
有没有Oracle自带的工具让它入库?
当然,要插入到哪个表是已经确定的,字段长度,类型都已经是确定的。
txt里的数据用 逗号 分隔。
我这个txt数据还有点特殊性,每次都只有一条记录(也就是一行)
 
nt是吧?
利用nt的schedule服务,定时启动sqlldr,把txt的内容写入数据库
 
1、你的程序中设置要设置定时写数据功能,这个简单就不多说;
2、你在附件中打开任务计划,按排定时打开你的程序,比你的定时时间稍前一些;
3、如果你的程序要大量发行,你得用程序往任务计划中添加'2'中所说的功能。
 
我用的是win2k Server
大侠说的是 控制面板,计划任务吗?
可是我不想编exe程序,sqlldr是什么程序还是命令行?
具体的语法怎么用?恳请执教!
 
>>你的程序中设置要设置定时写数据功能,这个简单就不多说;
惭愧,我试试吧,Delphi几乎全忘了,VC也没有钻研,还不知道能不能编出来,虽然我知道很简单。

还有,请教:有没有Oracle自带的工具让它入库?
 
用Ttime啊,就是一个小钟面的那个,点到你的面板上来,再点点他……
不行,你就咬他一口看看……
 
sqlldr是oracle自己带来的导入文本的
schedule服务,就是at服务,命令行执行 at /?
 
to Pipi.
>>sqlldr是oracle自己带来的导入文本的
我是想知道sqlldr怎么用?
是不是在cmd下执行 sqlldr ....?不行啊.
还是在Sql Plus 里执行sqlldr ....?也不行啊。
>>schedule服务,就是at服务,命令行执行 at /?
我觉得就是 控制面板,计划任务,这个问题不大。
主要还是向您请教 sqlldr的用法。

在安装Oralce后,开始菜单中,我怎么也找不到 sqlldr
 
load data
infile 'new.dat'
into table TEST_D2
(
YEAR position(1:4),
TM position(6:7),
TMAX position(9:10)
)
这样写也不行,恳请指教!
 
to Pipi.
我的mycontrol.ctl文件:
load data
infile 'new.dat'
into table TEST_D2
fields terminated by ','
( YEAR NUMBER (10),
DAY NUMBER (10),
TM NUMBER (10),
TMAX NUMBER (10),
TMIN NUMBER (10),
PREC NUMBER (10),
FMAXS NUMBER (10),
FGS NUMBER (10),
SUNSHINE NUMBER (10))

我的test.bat文件:
sqlldr dev/dev@TEST_D2 control=mycontrol

我的new.dat文件
3000,11,12,13,14,15,16,17,18

执行结果:
SQL*Loader-350: 语法错误位于第6行。
预期值是","或")",而实际值是"NUMBER"。
( YEAR NUMBER (10),
^
无论我是否去掉number,就是导不进去,恳请大侠指教!
 
试试PiPi说的吧。
 
我已经试了,就是语法写不对。也不知道去哪里查sqlldr帮助。
 

      SQL*LOADER的速成教程
文/范生
  SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中。SQL*LOADER是大型数据
仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。现在,我们抛开其理论不谈,用实例来使
您快速掌握SQL*LOADER的使用方法。
  首先,我们认识一下SQL*LOADER。
  在NT下,SQL*LOADER的命令为SQLLDR,在UNIX下一般为sqlldr/sqlload。
  如执行:d:/oracle>sqlldr
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 11:06:42 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.

用法: SQLLOAD 关键字 = 值 [,keyword=value,...]
有效的关键字:
userid -- ORACLE username/password
control -- Control file name
log -- Log file name
bad -- Bad file name
data -- Data file name
discard -- Discard file name
discardmax -- Number of discards to allow (全部默认)
skip -- Number of logical records to skip (默认0)
load -- Number of logical records to load (全部默认)
errors -- Number of errors to allow (默认50)
rows -- Number of rows in conventional path bind array or between direct p
ath data saves
(默认: 常规路径 64, 所有直接路径)
bindsize -- Size of conventional path bind array in bytes(默认65536)
silent -- Suppress messages during run (header,feedback,errors,discards,part
itions)
direct -- use direct path (默认FALSE)
parfile -- parameter file: name of file that contains parameter specification
s
parallel -- do parallel load (默认FALSE)
file -- File to allocate extents from
skip_unusable_indexes -- disallow/allow unusable indexes or index partitions(默
认FALSE)
skip_index_maintenance -- do not maintain indexes, mark affected indexes as unus
able(默认FALSE)
commit_discontinued -- commit loaded rows when load is discontinued(默认FALSE)
readsize -- Size of Read buffer (默认1048576)
PLEASE NOTE: 命令行参数可以由位置或关键字指定
。前者的例子是 'sqlload
scott/tiger foo';后者的例子是 'sqlload control=foo
userid=scott/tiger'.位置指定参数的时间必须早于
但不可迟于由关键字指定的参数。例如,
'SQLLOAD SCott/tiger control=foo logfile=log', 但
'不允许 sqlload scott/tiger control=foo log',即使允许
参数 'log' 的位置正确。
d:/oracle>
我们可以从中看到一些基本的帮助信息,这里,我用到的是中文的WIN2000 ADV SERVER。
  我们知道,SQL*LOADER只能导入纯文本,所以我们现在开始以实例来讲解其用法。
  一、已存在数据源result.csv,欲倒入ORACLE中FANCY用户下。
    result.csv内容:
  1,默认 Web 站点,192.168.2.254:80:,RUNNING
  2,other,192.168.2.254:80:test.com,STOPPED
  3,third,192.168.2.254:81:thirdabc.com,RUNNING
  从中,我们看出4列,分别以逗号分隔,为变长字符串。
  二、制定控制文件result.ctl
result.ctl内容:
load data
infile 'result.csv'
into table resultxt
(resultid char terminated by ',',
website char terminated by ',',
ipport char terminated by ',',
status char terminated by whitespace)
  说明:
  infile 指数据源文件 这里我们省略了默认的 discardfile result.dsc badfile result.bad
  into table resultxt 默认是INSERT,也可以into table resultxt APPEND为追加方式,或REPLACE
  terminated by ',' 指用逗号分隔
  terminated by whitespace 结尾以空白分隔
  三、此时我们执行加载:
D:/>sqlldr userid=fancy/testpass control=result.ctl log=resulthis.out
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:25:42 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.
SQL*Loader-941: 在描述表RESULTXT时出现错误
ORA-04043: 对象 RESULTXT 不存在
  提示出错,因为数据库没有对应的表。
  四、在数据库建立表
  create table resultxt
(resultid varchar2(500),
website varchar2(500),
ipport varchar2(500),
status varchar2(500))
/
  五、重新执行加载
  D:/>sqlldr userid=fancy/k1i7l6l8 control=result.ctl log=resulthis.out
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:31:57 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.
达到提交点,逻辑记录计数2
达到提交点,逻辑记录计数3
  已经成功!我们可以通过日志文件来分析其过程:resulthis.out内容如下:
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:31:57 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.
控制文件: result.ctl
数据文件: result.csv
错误文件: result.bad
废弃文件: 未作指定
:
(可废弃所有记录)
装载数: ALL
跳过数: 0
允许的错误: 50
绑定数组: 64 行,最大 65536 字节
继续: 未作指定
所用路径: 常规
表RESULTXT
已载入从每个逻辑记录
插入选项对此表INSERT生效
列名 位置 长度 中止 包装数据类型
------------------------------ ---------- ----- ---- ---- ---------------------
RESULTID FIRST * , CHARACTER
WEBSITE NEXT * , CHARACTER
IPPORT NEXT * , CHARACTER
STATUS NEXT * WHT CHARACTER

表RESULTXT:
3 行载入成功
由于数据错误, 0 行没有载入。
由于所有 WHEN 子句失败, 0 行没有载入。
由于所有字段都为空的, 0 行没有载入。

为结合数组分配的空间: 65016字节(63行)
除绑定数组外的内存空间分配: 0字节
跳过的逻辑记录总数: 0
读取的逻辑记录总数: 3
拒绝的逻辑记录总数: 0
废弃的逻辑记录总数: 0
从星期二 1月 08 10:31:57 2002开始运行
在星期二 1月 08 10:32:00 2002处运行结束
经过时间为: 00: 00: 02.70
CPU 时间为: 00: 00: 00.10(可
  六、并发操作
  sqlldr userid=/ control=result1.ctl direct=true parallel=true
sqlldr userid=/ control=result2.ctl direct=true parallel=true
sqlldr userid=/ control=result2.ctl direct=true parallel=true
当加载大量数据时(大约超过10GB),最好抑制日志的产生:
  SQL>ALTER TABLE RESULTXT nologging;
这样不产生REDO LOG,可以提高效率。然后在CONTROL文件中load data上面加一行:unrecoverable
此选项必须要与DIRECT共同应用。
  在并发操作时,ORACLE声称可以达到每小时处理100GB数据的能力!其实,估计能到1-10G就算不错了,开始可用结构
相同的文件,但只有少量数据,成功后开始加载大量数据,这样可以避免时间的浪费。

  综上所述,SQL*LOADER的速成教程已经结束,条件分支等用法需要大家在日后工作中积累,我的观点是“用起来”,
然后再深造。兴趣是人类的第一教师,此话一点不错。始终让自己保持对技术的热情比埋头苦读更重要,技术的道路未必艰辛,
却是孤独的,能够忍受寂寞的人,才可能实现事业与人生的丰收。

 
多谢飘摇客大哥,其实这个我已经看过了。
我再好好研究一下吧,再出不来结果就有点说不过去了。
 
多谢诸位大哥,终于成功了,小弟真是很高兴(曾经很郁闷)。
回顾自己的历程,烦了不少错误,如下:
1。YEAR NUMBER (10), 这样写不对。现在看来不用写数据类型,也许不符合条件的数据(比如字母)就自动不入库了。
2。YEAR position(1:4) char ,这样写也不对。可是《Oracle初学者指南》上就是这么用的。我会再试一试。
3。fields terminated by ','必须要写。
4。要注意用APPEND into table TEST_D2,就算是空表也适用。
into table TEST_D2 默认 insert,只能用于空表。

哎,编程的革命历程还是很艰难啊。这么简单的几句话,居然犯了这么多错!!!
 
正确文件如下:

我的mycontrol.ctl文件:
load data
infile 'new.dat'
APPEND into table TEST_D2
fields terminated by ','
(YEAR, DAY, TM, TMAX, TMIN, PREC, FMAXS, FGS, SUNSHINE)

我的test.bat文件:
sqlldr DEV/DEV@weather control=mycontrol

我的new.dat文件
4001,11,12,13,14,15,16,17,18
 
感谢几位兄弟,区区100分不成敬意。
 

Similar threads

回复
0
查看
888
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
758
SUNSTONE的Delphi笔记
S
后退
顶部