我想知道是否有人对我即将开始的事情有任何经验.我有几个csv文件大小都在GB左右,我需要将它们加载到oracle数据库中.虽然我加载后的大多数工作都是只读的,但我还是需要不时加载更新.基本上我只需要一个很好的工具来一次加载几行数据直到我的数据库.
这是我到目前为止所发现的:
我可以使用SQL Loader做很多工作
我可以使用批量插入命令
某种批量插入.
以某种方式使用预备语句可能是个好主意.我想我想知道每个人都认为这是完成插入的最快方法.有小费吗?
假设你有一张桌子:
CREATE TABLE Customer
(
batch_id NUMBER,
customer_name VARCHAR2(20),
customer_address VARCHAR2(100)
)
Run Code Online (Sandbox Code Playgroud)
并假设您有一个控制文件来填充此表:
LOAD DATA INFILE 'customers.dat' REPLACE INTO TABLE Customer ( batch_id ??????, customer_name POSITION(001:020), customer_address POSITION(021:120) )
batch_id我运行SQL*Loader时是否可以将值传递给我的控制文件?例如,是否可以指定绑定变量(将问号转换为:MY_AWESOME_BATCH_ID)?
我想创建 shell 脚本AUTOLOAD,运行时它将使用一组指令执行 SQL*Loader。这一切都是在我的Linux环境下进行的。
SQL*loader 然后将数据导入到 SQL Developer
#!/bin/sh
#
echo -------- SQL loader --------
# @echo;
#
sqlldr username@server1/password control=/folder1/ctrl/loader.ctl log=/folder1/load/results.l
Run Code Online (Sandbox Code Playgroud)
我的 shell 脚本位于根目录中,这是我调用其他文件的地方。但当我尝试运行它时,它给了我错误:
- line 6: sqlldr: command not found
Run Code Online (Sandbox Code Playgroud)
我不知道如何指定 SQL*Loader 的路径,因为我在 Linux 上。
我对此很陌生......所以要温柔:(
我使用oracle 10g,我有这个file.ctl
OPTIONS (SKIP=1)
LOAD DATA
INFILE '/home/gxs/segmentation/sqlloader/datos.csv'
APPEND INTO TABLE test
(id "s_test.nextval",
name char(10) TERMINATED BY ',' ,
tel char(20) TERMINATED BY ',' ,
apellido char(10) TERMINATED BY ',' )
Run Code Online (Sandbox Code Playgroud)
我的csv文件es
name,tel,apellido
daniel,12345,buitrago
cesar,98765,san
alex,4556,ova
Run Code Online (Sandbox Code Playgroud)
但是当看到表时,名字没有第一个字符:
id name apellido tel
1 aniel buitrago 12345
2 esar san 98765
3 lex ova 4556
Run Code Online (Sandbox Code Playgroud)
做什么?
我正在尝试将记录文件导入到表中并且正在获取
Rejected - Error on table FUNDPRICE_TEST, column FUNDDATE.
ORA-01843: not a valid month
Run Code Online (Sandbox Code Playgroud)
我做了一些研究,并且读到默认情况下Oracle预计日期格式为yyyymmdd.显然,当第一天的值(我的第一个记录)超过12时,这会抛出一个错误.
如何将导出的csv文件中的日期格式化mm/dd/yyyy 00:00:00为此yyyymmdd格式?
这当然是假设这是我的问题.我可能会咆哮错误的树.
尝试日期格式化后,这是ctl文件:
load data
infile 'commands/FundPriceDataNEW2.txt'
into table FundPrice
fields terminated by "," optionally enclosed by '"'
( FUND, FUNDDATE DATE "mm/dd/yyyy HH24:MI:SS", FAV, FUNDVALUE )
Run Code Online (Sandbox Code Playgroud)
以下是FundPriceDataNEW2.txt中的一些记录:
16,9/30/1999 0:00:00,"999999",9.64
16,10/31/1999 0:00:00,"999999",10.06
16,11/30/1999 0:00:00,"999999",10.40
Run Code Online (Sandbox Code Playgroud)
订单是fund,funddate,fav,fundvalue.错误发生在格式无效的日期.
我可以在SQL LOADER中执行类似的操作吗?
LOAD DATA
INFILE 'table_with_one_million_rows.dat'
INTO TABLE TABLE_WITH_ONE_MILLION_ROWS
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(
COL1 DECIMAL
, COL2 DECIMAL IF COL1='X' '1' else '0'
, COL3 CHAR
)
Run Code Online (Sandbox Code Playgroud) 我的.sh文件包含下一个内容:
#!/bin/bash
echo -------- uploader.sh v 0.1 --------
ORACLE_HOME=/opt/app/oracle/product/10.2.0/db_1/bin/
export ORACLE_HOME
PATH=$ORACLE_HOME
export PATH
sqlldr userid=PR/0611@database control=control_file.ctl LOG=fb_log.log errors=100
Run Code Online (Sandbox Code Playgroud)
所以,我想运行sql loader并上传数据.当我运行uploader.sh时,我收到来自unix的下一条消息:
未找到消息2100; 没有找到product = RDBMS,facility = ULMessage 2100的消息文件; product = RDBMS,facility = UL没有消息文件
我已经读过它并得出结论,问题出在环境变量中.你可以帮我解决这个错误吗?
我正在oracle 11g中使用sqlldr(sql loader).我试图将3个字段连接成一个字段.有没有人这样做过?
ex:TABLE - "CELLINFO",其中字段为(mobile_no,service,longitude).
给出的数据是(+ 9198449844,idea,110,25,50)即(mobile_no,service,grad,min,sec).
但是在将数据加载到表中时,我需要将最后3个字段(grad,min,sec)连接到表的经度字段中.
在这里我无法手动编辑,因为我有1000个数据要加载.
我也尝试过使用||,+和concat()....但我无法做到.
sqlldr "xxxx/xxxx@YYYYYXXXX" control=/home/local/INTERNAL/xxxxx/Presc_SQLLDR_File/Presc_SQLLDR.ctl log=/home/local/INTERNAL/xxxxx/Presc_SQLLDR_File/Presc_log.log data=home/achand/Presc_SQLLDR_File/Presc_SQLLDR.ctl
Run Code Online (Sandbox Code Playgroud)
每当我尝试执行 sqlldr 时,都会出现以下错误
SQL*Loader-704: Internal error: ulconnect: OCIServerAttach [0]
ORA-12154: TNS:could not resolve the connect identifier specified
Run Code Online (Sandbox Code Playgroud)
我试过 tnsping YYYYYXXXX
我得到以下错误
TNS-03505:无法解析名称
tnsnames.ora 包含
DDCPPSD.WORLD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = XXXXXYYY)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = YYYYYXXXX)
)
)
Run Code Online (Sandbox Code Playgroud) 直截了当的问题..
Oracle 10 的文档指出:
(注意,我链接到 10g,因为它最方便,我将回答 Oracle 10 和/或 Oracle 11,无论哪种方式都可以 - 我怀疑它会是相同的答案 - 所以我添加了两个标签) .
ERRORS(允许的错误) 默认值:要查看此参数的默认值,请在不带任何参数的情况下调用 SQL Loader,如调用 SQL Loader 中所述。
ERRORS 指定允许的最大插入错误数。如果错误数超过为 ERRORS 指定的值,则 SQL*Loader 将终止加载。要完全不允许错误,请设置 ERRORS=0。要指定允许所有错误,请使用非常大的数字。
(强调我的)。
因此,由于 Oracle 最多可以处理 NUMBER(38) .. 我试过:
ERRORS=999999999999999999999999999999999999
Run Code Online (Sandbox Code Playgroud)
(36 位)
并立即收到此错误:
SQL*Loader-100:命令行上的语法错误
尝试一个小得多的数字:
ERRORS=999999
Run Code Online (Sandbox Code Playgroud)
工作正常。
那么您可以在这里使用的最大值是多少?我没有在文档中找到它,所以不确定我是否找错了地方,或者它不在那里:)
是的,我需要一个大数字,我正在加载一个数百万行的文件,所以我想使用最大的可能来避免任何未来的问题。