我正在使用这个序列:
CREATE SEQUENCE ORG_SEQ
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO CYCLE
CACHE 24;
我正在尝试使用从select语句接收的特定数字开始序列,但是它不起作用,因为它总是需要一个数字签名的文字。
有人知道另一种选择吗?
我尝试过其他帖子的解决方案,但是它们不适用于我的DB2。
谢谢。
*我使用Linux作为DB OS
答案 0 :(得分:0)
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,然后根据结果构建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