Oracle11g 在SQL加载器的列中传递变量
是否有一种方法可以使用SQL加载器控制文件通过变量传递列的默认值。 我想将默认值传递给Oracle表列,但不想硬编码。是否可以使用可以根据需要更改的变量传递它Oracle11g 在SQL加载器的列中传递变量,oracle11g,sql-loader,Oracle11g,Sql Loader,是否有一种方法可以使用SQL加载器控制文件通过变量传递列的默认值。 我想将默认值传递给Oracle表列,但不想硬编码。是否可以使用可以根据需要更改的变量传递它 谢谢。不,您不能在命令行或环境中传入变量。不能传入任意值,并且控制文件不能识别对环境变量的引用 我认为,最好是使用一个带有占位符的模板控制文件,在其中使用变量值,然后从模板生成真正的控制文件,在创建时替换变量(例如,使用sed) 假设您的表有三列三列,为了简单起见,您需要其中两列的默认值,一个字符串和一个数字。您可以有一个名为templa
谢谢。不,您不能在命令行或环境中传入变量。不能传入任意值,并且控制文件不能识别对环境变量的引用 我认为,最好是使用一个带有占位符的模板控制文件,在其中使用变量值,然后从模板生成真正的控制文件,在创建时替换变量(例如,使用
sed
)
假设您的表有三列三列,为了简单起见,您需要其中两列的默认值,一个字符串和一个数字。您可以有一个名为template.ctl
的文件,其中包括:
...
fields terminated by ','
trailing nullcols
(
id,
col2 "nvl(:col2, '<DEFAULT_STR>')",
col3 "nvl(:col3, <DEFAULT_NUM>)"
)
因此,当您运行SQL*Loader时,它将使用这些默认值
如果可以同时运行多次,则可以使“真实”控制文件名唯一,例如通过附加当前shell进程ID
另一种选择是加载到允许空值的暂存表,然后从暂存表填充实际表-使用传递到SQL*Plus的位置参数将空值的转换应用到默认值,作为同一shell脚本的一部分 在shell脚本中,调用SQL*Loader,但控制文件指向一个临时表:
sqlldr usr/pwd control=stage.ctl file=...
然后调用SQL*Plus,要么调用一个默认接受位置参数的脚本,要么调用内联,因为它相当简单;同样,假设您的表有三列,为了简单起见,您需要其中两列的默认值,一个字符串和一个数字:
DEFAULT_STR="Some value"
DEFAULT_NUM=42
sqlplus -l -s usr/pwd <<!EOF
whenever sqlerror exit failure rollback
insert into real_table (id, col2, col3)
select id, nvl(col2, '${DEFAULT_STR}'), nvl(col3, $DEFAULT_NUM)
from staging_table;
commit;
exit;
!EOF
DEFAULT\u STR=“一些值”
默认值\u NUM=42
sqlplus-l-s usr/pwd
(未经测试,但希望能为您提供要点!)
创建sqlldr文件,并在希望${env_var}到达的任何位置使用独特的字符串
例如,(通常,infle数据文件是更改的内容),
因此,创建一个文件${standardFileName}\u TEMPLATE.ctl
在行“inflile”所在的sqlldr模板文件中,放置:
填充“xxxxxxxx”
(xxxxxxxx是unqique字符串)
然后从shell中执行以下操作:
对于'ls-1中的i所有填充*.csv`
做
回声“-----------------------------”;
echo$i;
cp${i}./${standardFileName};
cp${standardFileName}_TEMPLATE.ctl加载${standardFileName}.ctl;
sed-i“s/xxxxxxxx/${i}/g”加载${standardFileName}.ctl
sqlldr$CONN_INFO control=load_${standardFileName}.ctl log=load_${i}.ctl.log;
完成;
这应该允许您运行一个sqlldr脚本,为每个过程提取一个特定的环境变量。为什么不在表级别为列创建一个默认值呢?这有一些其他的功能限制。但是我想知道是否有办法通过SQL loader。您所说的按需更改是什么意思?编辑控制文件?默认情况下,如果数据文件中的字段为空,则表示要使用的值?@Alex yes如果字段为空,则表示该值。。我想将变量传递给控制文件,该文件的值将从执行sqlldr命令的shell脚本中收集。感谢您的回答,但您能否详细解释第一部分。。任何伪代码示例也会有所帮助。@sqlpractice-OK,为这两种方法添加了扩展但未经测试的示例。
sqlldr usr/pwd control=stage.ctl file=...
DEFAULT_STR="Some value"
DEFAULT_NUM=42
sqlplus -l -s usr/pwd <<!EOF
whenever sqlerror exit failure rollback
insert into real_table (id, col2, col3)
select id, nvl(col2, '${DEFAULT_STR}'), nvl(col3, $DEFAULT_NUM)
from staging_table;
commit;
exit;
!EOF