我正在使用这个序列:
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 不允许对序列上的 CREATE
或 ALTER
语句进行子选择或参数。您可以在图表上看到它只允许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