下面是我的控制文件示例:
OPTIONS (skip=1,errors=1000,direct=true,rows=10000)
load data
append
into table TABLE_NAME
fields terminated by ','
OPTIONALLY ENCLOSED BY '"'
trailing nullcols(
DATE_ID DATE_ID_VALUE,
DESC1 char(1000),
DESC2 char(1000),
DISP_URL char(1000),
DEST_URL char(1000),
ACCT_ID ACCOUNTID_VALUE,
Acct_num ACCOUNT_NUM,
created_date SYSDATE
)
我需要从sqlldr命令传递DATE_ID_VALUE、ACCOUNTID、ACCOUNTNUM值。我通过csv文件传递重命名列数据,而csv文件是从sqlldr " data“参数传递的。有没有办法通过sqlldr命令或任何其他方式传递其他所需的参数?
下面是我的sqlldr命令:
sqlldr userid=abc/abcdef@abcdefgh CONTROL= cont.ctl DATA= $csvFilePath LOG=admaster.log BAD=admaster.bad
发布于 2014-12-17 02:51:12
我知道这很古老,但我只是偶然发现了它,最近我回答了一个类似的问题。请参阅我在这里的回复,了解从包装程序创建控制文件的技术。
发布于 2016-07-14 23:32:53
不可能对.ctl文件中的变量进行参数化,但是可以完全省去.ctl文件,并对您想要的任何内容进行参数化。
您不需要直接调用sqlldr,而是需要声明一个外部表,然后执行SQL INSERT into TABLE_NAME SELECT * from EXTERNAL_TABLE;
。外部表声明包含在后台使用的sqlldr参数,并在SQL查询中定义,该查询可以直接从Unix shell运行,所有必需的参数都指定为Unix系统变量或命令。
例如,在您的调用环境中设置了$DATE_ID_VALUE和其他2个变量的值后,首先创建一个外部表:
echo "create table myschema.temp_table_name (
DATE_ID INTEGER,
DESC1 char(1000),
DESC2 char(1000),
DISP_URL char(1000),
DEST_URL char(1000),
ACCT_ID INTEGER,
Acct_num INTEGER,
created_date DATE)
organization external
(
type oracle_loader
default directory mydir
access parameters (
records delimited by newline
badfile bad_dir: 'temp_ext_temp_table_name_load.bad'
logfile log_dir: 'temp_ext_temp_table_name_load.log'
fields terminated by ',' (
DESC1 char(1000),
DESC2 char(1000),
DISP_URL char(1000),
DEST_URL char(1000)
)
column transforms (
DATE_ID FROM CONSTANT '$DATE_ID_VALUE',
ACCT_ID FROM CONSTANT '$ACCOUNTID_VALUE',
Acct_num FROM CONSTANT '$ACCOUNT_NUM',
created_date FROM CONSTANT \"`date '+%d-%b-%Y'`\"
)
)
location ('temp_table_name.dat')
)
reject limit 1000;" | sqlplus -s /
column transforms
子句将使用从环境变量和Unix date命令解析的常量值填充外部表。
然后将insert插入到目标表中(可选的append
提示用于直接路径加载):
insert /*+ append */ into table_name
select * from myschema.temp_table_name;
我找不到一种方法来包含SYSDATE,所以使用了等效的Unix date命令。
https://stackoverflow.com/questions/21278726
复制相似问题