Oracle11g 在SQL加载器的列中传递变量

Oracle11g 在SQL加载器的列中传递变量,oracle11g,sql-loader,Oracle11g,Sql Loader,是否有一种方法可以使用SQL加载器控制文件通过变量传递列的默认值。 我想将默认值传递给Oracle表列,但不想硬编码。是否可以使用可以根据需要更改的变量传递它 谢谢。不,您不能在命令行或环境中传入变量。不能传入任意值,并且控制文件不能识别对环境变量的引用 我认为,最好是使用一个带有占位符的模板控制文件,在其中使用变量值,然后从模板生成真正的控制文件,在创建时替换变量(例如,使用sed) 假设您的表有三列三列,为了简单起见,您需要其中两列的默认值,一个字符串和一个数字。您可以有一个名为templa

是否有一种方法可以使用SQL加载器控制文件通过变量传递列的默认值。 我想将默认值传递给Oracle表列,但不想硬编码。是否可以使用可以根据需要更改的变量传递它


谢谢。

不,您不能在命令行或环境中传入变量。不能传入任意值,并且控制文件不能识别对环境变量的引用

我认为,最好是使用一个带有占位符的模板控制文件,在其中使用变量值,然后从模板生成真正的控制文件,在创建时替换变量(例如,使用
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