使用“从表选择”的 DB2 启动序列



我正在使用这个序列:

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

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

有人知道替代方案吗?

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

谢谢。

*我使用 Linux a 数据库操作系统

这样的事情应该可以工作:

begin
  declare newmax int;
  set curmax = select max(whatever) from sometable;
  execute immediate 'alter sequence your_seq restart with ' || curmax+1;
end

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,然后从结果构建创建或更改(例如,使用字符串连接(。

如果您的 Db2-database 在 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

最新更新