Oracle 11g - 使用序列中的常量值填充表行

Posted

技术标签:

【中文标题】Oracle 11g - 使用序列中的常量值填充表行【英文标题】:Oracle 11g - populate table rows with constant value from sequence 【发布时间】:2016-07-11 10:22:46 【问题描述】:

我正在将一些旧版 SQL 加载程序脚本转换为外部表。外部表已启动并正在运行,因此下一步是使用来自外部表的数据填充表。 SQL Loader 脚本如下所示:

Load Data                                                                   
Append 
Into Table my_table
Fields Terminated by "|"  Trailing Nullcols          
(                                                                               
    MY_COL                  "Trim(:SOME_COL)",                                          
    SESS_ID                 CONSTANT #$SESSION$#,
    FILEREC                 RECNUM,
    REC_ID                  SEQUENCE(MAX)
) 

当使用 SQL Loader 加载数据时,还有其他逻辑,例如会话 ID,它是序列中的下一个值,它用作批处理中所有行的常量。我打算按以下方式进行,但我不能在子查询中使用序列(我也尝试使用插入语句,但在这种情况下,每条记录都会从序列中获取下一个值):

CREATE table my_table(
    my_col,
    session
)
AS SELECT
    e.my_col,
    my_seq.nextval
FROM my_external_table e;

问题 - 有没有办法用来自sequence.nextval 的常量值填充所有行?我知道我可以通过多个步骤来完成,比如创建表,然后更新会话 ID 列,但我想知道有没有办法在单个 SQL 语句中完成(试图避免 PL/SQL)?计划结果如下:

my_col  seq.nextval
aaaaaa  99
bbbbbb  99
cccccc  99

但我得到了关注(使用插入语句时):

my_col  seq.nextval
aaaaaa  99
bbbbbb  100
cccccc  101

【问题讨论】:

【参考方案1】:

seq.nextval 总是返回下一个值。您正在寻找seq.currval

遗憾的是,seq.currval 要求您之前在同一会话中使用 seq.nextval;然后currval 将返回您通过nextval 获得的值。因此,在 sql*loader 操作中,您很不走运,因为您无法说服它事先执行 seq.nextval

因此,您需要多个步骤。

【讨论】:

我想出的解决方案 - 将当前会话 ID 插入带有 my_seq.nextval 的表中,然后从该表中选择最大会话 ID 到目标表中

以上是关于Oracle 11g - 使用序列中的常量值填充表行的主要内容,如果未能解决你的问题,请参考以下文章

oracle 11g 中的重置序列

oracle数据库,怎么给已有很多数据的表填充自增序列字段

将 Oracle 序列重置为现有列中的下一个值的最佳方法?

Oracle 11g:用表 B 中的最新记录替换表 A 上的记录

如何使用 Oracle 11g 中的 XMLAGG 函数序列化树数据而不是重复的 XML 标记,嵌套结构?

oracle 11g 新增分区