我一直在寻找一段时间,但似乎无法找到答案所以这里...
我有一个CSV文件,我想导入Oracle(9i/10i)中的表.
后来我打算用这个表作为另一种用途的查找.
这实际上是一种变通方法我工作以来的事实,使用IN子句多于1000个值查询是不可能的.
如何使用SQLPLUS完成?
谢谢你的时间!:)
如何在Oracle中禁用并稍后启用给定模式/数据库中的所有索引?
注意:这是为了使sqlldr运行得更快.
我没有意识到这一点,但显然Python的strftime
功能不支持1900年之前的日期:
>>> from datetime import datetime
>>> d = datetime(1899, 1, 1)
>>> d.strftime('%Y-%m-%d')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: year=1899 is before 1900; the datetime strftime() methods require year >= 1900
Run Code Online (Sandbox Code Playgroud)
我确信我可以自己做一些事情来做这件事,但我认为这个strftime
功能是有原因的(而且还有一个原因,它不能支持1900年以前的日期).我需要能够支持1900年之前的日期.我只是使用str
,但是有太多的变化.换句话说,它可能有也可能没有微秒,或者它可能有也可能没有时区.这有什么解决方案吗?
如果它有所不同,我这样做是为了我可以将数据写入文本文件并使用Oracle SQL*Loader将其加载到数据库中.
我基本上最终做了Alex Martelli的回答.这是一个更完整的实现:
>>> from datetime import datetime
>>> d = datetime.now()
>>> d = d.replace(microsecond=0, tzinfo=None)
>>> str(d)
'2009-10-29 11:27:27'
Run Code Online (Sandbox Code Playgroud)
唯一的区别str(d)
是相当于d.isoformat(' ')
.
我有一个深奥的sqlldr问题困扰着我.我的控制文件看起来像这样:
load data
infile 'txgen.dat'
into table TRANSACTION_NEW
fields terminated by "," optionally enclosed by '"'
TRAILING NULLCOLS
( A,
B,
C,
D,
ID "ID_SEQ.NEXTVAL"
)
Run Code Online (Sandbox Code Playgroud)
数据是这样的:
a,b,c,
a,b,,d
a,b,,
a,b,c,d
Run Code Online (Sandbox Code Playgroud)
如果我没有把TRAILING NULLCOLS放入,我得到"在逻辑记录结束之前找不到列"错误.但是虽然有些列是空的,但是逗号都在那里,所以我没有看到sqlldr错误解释输入文件的原因,并且没有到达它从数据库序列生成ID的结尾.
这个语法之前没有空列 - 为什么空列导致sqlldr无法到达生成的列?
我有它的工作,我只想了解为什么!?!
我正在使用SQL Loader读取管道分隔文件,并希望填充我正在填充的表中的LAST_UPDATED字段.我的控制文件如下所示:
LOAD DATA
INFILE SampleFile.dat
REPLACE
INTO TABLE contact
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
(
ID,
FIRST_NAME,
LAST_NAME,
EMAIL,
DEPARTMENT_ID,
LAST_UPDATED SYSTIMESTAMP
)
Run Code Online (Sandbox Code Playgroud)
对于LAST_UPDATED字段,我尝试过SYSTIMESTAMP和CURRENT_TIMESTAMP,但都不起作用.然而,SYSDATE工作正常,但不给我一天的时间.
我是SQL Loader的新手,所以我真的很清楚它是什么或不具备的.谢谢.
我很难将sqlldr
csv数据文件导入到我的表中,特别是使用时间戳字段.
我的csv文件中的数据采用以下格式:
16-NOV-09 01.57.48.001000 PM
Run Code Online (Sandbox Code Playgroud)
我已经在我的控制文件中尝试了所有方式的组合,并在圈子中进行.我在网上找不到任何东西 - 甚至没有详细说明所有日期/时间戳格式字符串的Oracle参考页面.
有谁知道这个参考页面在哪里,或者我应该在我的控制文件中使用什么格式字符串来获取此时间戳格式.
作为参考,这是我最近尝试过的:
load data
infile 'kev.csv'
into table page_hits
fields terminated by "~"
( ...
event_timestamp TIMESTAMP "dd-mmm-yy hh24.mi.ss",
...)
Run Code Online (Sandbox Code Playgroud) 是否可以使用与Oracle 10/11捆绑的sqlldr使用完全限定的TNS条目?
例如,在SQLPlus中:
sqlplus user/password@(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl))) @script.sql
Run Code Online (Sandbox Code Playgroud)
但是使用sqlldr(SQL Loader)似乎直接使用TNS条目存在问题.特别:
sqlldr user/password@(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl))) bad='bad_file.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true'
Run Code Online (Sandbox Code Playgroud)
这是产生的错误消息:
LRM-00116: syntax error at 'address' following '('
SQL*Loader: Release 11.2.0.1.0 - Production on Tue Sep 13 15:41:54 2011
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
SQL*Loader-100: Syntax error on command-line
Run Code Online (Sandbox Code Playgroud)
尝试将TNS条目封装在引号中会产生相同的错误.
看看sqlldr文档,并尝试使用'userid'命令行参数无济于事.特别:
sqlldr userid='user/password@(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))' bad='bad.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true'
LRM-00116: syntax error at 'password@(' following '='
SQL*Loader: Release 11.2.0.1.0 - Production on Tue Sep 13 15:44:17 2011
Copyright (c) 1982, …
Run Code Online (Sandbox Code Playgroud) 我有一个SQL Loader Control文件,
LOAD DATA
INFILE 'test.txt'
INTO TABLE TEST replace
fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS
( DOCUMENTID INTEGER(10),
CUSTID INTEGER(10),
USERID INTEGER(10),
FILENAME VARCHAR(255),
LABEL VARCHAR(50),
DESCRIPTION VARCHAR(2000),
POSTDATE DATE "YYYY-MM-DD HH24:MI:SS" NULLIF POSTDATE="",
USERFILENAME VARCHAR(50),
STORAGEPATH VARCHAR(255)
)
Run Code Online (Sandbox Code Playgroud)
当我在其上运行SQL Loader时,它给了我一个错误,
Record 1: Rejected - Error on table TEST, column FILENAME.
Variable length field exceeds maximum length.
这是那行...该列的长度低于255 ..
1|5001572|2|/Storage/Test/5001572/test.pdf|test.pdf||2005-01-13 11:47:49||
这是我在日志文件中注意到的奇怪之处
Column Name | Position | Len | Term | Encl | Datatype
FILENAME …
当Oracle服务器在另一台机器上时,我发现OracleBulkCopy(ODP.NET)和SQL*Loader之间存在一些显着的性能差异.
我在Oracle中有一个非常基本的表,有三列(一个BINARY_FLOAT,两个NUMBER(18,0)).没有主键,索引,触发器等.它用作临时表以将批量数据传入DB.
SQL*Loader大约需要27秒才能将450万行加载到表中.
OracleBulkCopy大约需要10分钟才能加载100万行.
OracleBulkCopy,根据文档,*"...使用直接路径加载方法,它与Oracle SQL*Loader类似,但不一样."*在性能方面可能没有SQL*Loader ,但这种差异是荒谬的.
在对网络流量进行一些基本分析之后,我发现OracleBulkCopy正在发送和接收大量的小数据包.我使用Wireshark比较每个数据包,发现了一些有趣的结果.
SQL*Loader - 在初始连接握手之后 - 发送一系列8千字节数据包(TNS协议)并接收60字节的ACK作为响应.
OracleBulkCopy发送一系列102字节数据包(TNS协议)并接收133字节数据包(TNS协议)作为响应.什么......!?它就像是一次发送一行!
使用OracleBulkCopy类,我使用批量大小为100,000并使用自定义IDataReader从数据文件中读取.
所以,我的问题是:
有没有人见过这种行为?
OracleBulkCopy实际上是否作为批量加载工具执行?
有什么我需要配置,以使其正常工作?(客户端/服务器设置等)
任何帮助深表感谢.
我正在使用Linux shell中的Oracle Sql Loader Utility将csv数据加载到Oracle DB中.但我注意到,如果源csv文件行结尾为'\ r \n'(Windows格式),则sqlldr无法加载最后一列的数据.
例如,如果最后一列是FLOAT类型(在ctl文件中定义为'FLOAT EXTERNAL'),sqlldr将失败并显示'ORA-01722:无效数字':
Sqlldr ctl文件:
OPTIONS(silent=(HEADER))
load data
replace
into table fp_basic_bd
fields terminated by "|" optionally enclosed by '"'
TRAILING NULLCOLS
(
FS_PERM_SEC_ID CHAR(20),
"DATE" DATE "YYYY-MM-DD",
ADJDATE DATE "YYYY-MM-DD",
CURRENCY CHAR(3),
P_PRICE FLOAT EXTERNAL,
P_PRICE_OPEN FLOAT EXTERNAL,
P_PRICE_HIGH FLOAT EXTERNAL,
P_PRICE_LOW FLOAT EXTERNAL,
P_VOLUME FLOAT EXTERNAL
)
Run Code Online (Sandbox Code Playgroud)
sqlldr执行命令:
sqlldr -userid XXX -data ./test.data -log ./test.log -bad ./test.errors -control test.ctl -errors 3 -skip_unusable_indexes -skip_index_maintenance
Run Code Online (Sandbox Code Playgroud)
sqlldr错误日志:
Column Name Position Len Term Encl Datatype …
Run Code Online (Sandbox Code Playgroud)