以下是我的控制文件示例:
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文件传递重映射列数据,该文件从sqlldr“DATA”参数传递。有没有办法通过sqlldr命令或其他任何方式传递其他必需参数?
下面是我的sqlldr命令:
sqlldr userid=abc/abcdef@abcdefgh CONTROL= cont.ctl DATA= $csvFilePath LOG=admaster.log BAD=admaster.bad
答案 0 :(得分:0)
我知道这是旧的,但我偶然发现了它,我最近回答了类似的问题。请参阅我的回复,了解从包装程序创建控制文件的技术。
答案 1 :(得分:0)
无法对.ctl文件中的变量进行参数化,但可以完全省去.ctl文件并根据需要进行参数设置。
您需要声明外部表,然后执行SQL INSERT into TABLE_NAME SELECT * from EXTERNAL_TABLE;
,而不是直接调用sqlldr。外部表声明包含在幕后使用的sqlldr参数,并在SQL查询中定义,该查询可以直接从Unix shell运行,所有必需参数都指定为Unix系统变量或命令。
E.g。在调用环境中设置$ 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命令解析的常量值填充外部表。
然后插入目标表(可选append
提示直接路径加载):
insert /*+ append */ into table_name
select * from myschema.temp_table_name;
我找不到包含SYSDATE的方法,所以改为使用Unix date命令。