从表中选择的DB2启动序列

时间:2018-01-16 13:30:03

标签: db2 sequence increment db2-luw

我正在使用这个序列:

CREATE SEQUENCE ORG_SEQ
 START WITH 1
 INCREMENT BY 1
 NO MAXVALUE
 NO CYCLE
 CACHE 24;

我正在尝试使用从select语句接收的特定数字开始序列,但是它不起作用,因为它总是需要一个数字签名的文字。

有人知道另一种选择吗?

我尝试过其他帖子的解决方案,但是它们不适用于我的DB2。

谢谢。

*我使用Linux作为DB OS

3 个答案:

答案 0 :(得分:0)

DB2不允许序列上的CREATEALTER语句的子选择或参数。您可以在图表上看到它只允许numeric-constant

>>-ALTER SEQUENCE--sequence-name-------------------------------->

   .-----------------------------------------------.   
   V  (1)                                          |   
>----------+-RESTART--+------------------------+-+-+-----------><
           |          '-WITH--numeric-constant-' |     
           +-INCREMENT BY--numeric-constant------+     
           +-+-MINVALUE--numeric-constant-+------+     
           | '-NO MINVALUE----------------'      |     
           +-+-MAXVALUE--numeric-constant-+------+     
           | '-NO MAXVALUE----------------'      |     
           +-+-CYCLE----+------------------------+     
           | '-NO CYCLE-'                        |     
           +-+-CACHE--integer-constant-+---------+     
           | '-NO CACHE----------------'         |     
           '-+-ORDER----+------------------------'     
             '-NO ORDER-'                             

您最好的选择是运行SELECT,然后根据结果构建create或alter(例如,使用字符串连接)。

答案 1 :(得分:0)

如果你的Db2数据库在Linux上运行,你需要运行两个语句来重新定义序列。

第一个语句通过在目标表中依赖于序列的列上使用select max()来查找序列的下一个值。 第二个陈述改变了序列。

您可以使用脚本(例如在bash中),也可以使用存储过程(在SQL PL中)或复合SQL。

下面我展示一个简单的bash脚本,将本地运行到数据库,该数据库重新定义一个序列。

如果您的数据库是远程的,则需要修改连接语法以指定用户标识和密码。

运行此脚本的用户必须具有查询表并执行更改序列的适当权限。

#!/bin/bash
    #
    # Rebase a sequence in a local Db2 database


    typeset +i next_value=0
    typeset    database=your_db_name
    typeset    table_name=your_table_name
    typeset    base_schema=the_name_of_your_schema_that_contains_the_table
    typeset    column_name=the_name_of_the_column_that_uses_the_sequence
    typeset    seq_name=your_schema.your_sequence_name



    db2 connect to ${database}
    (( $? != 0 )) && print "Failed to connect to database" && exit 1

    next_value=$( db2 -x "select coalesce(max(${column_name},1)+1 from ${base_schema}.${table_name} " )
    (( $? > 2 )) && print "Failed to query ${base_schema}.${table_name}" && exit 1


    db2 -v alter sequence ${seq_name} restart with ${next_value}
    (( $? != 0 )) && print "Failed to alter sequence" && exit 1

    db2 -v connect reset

答案 2 :(得分:0)

这样的事情应该有效:

Redux