带有 PL SQL 的序列
Posted
技术标签:
【中文标题】带有 PL SQL 的序列【英文标题】:Sequences with PL SQL 【发布时间】:2011-11-29 23:36:10 【问题描述】:我知道如何在 pl sql 中创建一个序列。但是,我将如何将值设置为都具有 3 位数字?当我创建一个序列时,是否有另一个 sql 语句来执行此操作?
所以一个例子是:
000
001
012
003
谢谢大家!
【问题讨论】:
【参考方案1】:首先,为了清楚起见,您不会在 PL/SQL 中创建序列。您只能在 SQL 中创建序列。
其次,如果您希望一列恰好存储三位数字,则数据类型需要为 VARCHAR2
(或其他字符串类型),而不是更常见的 NUMBER
,因为根据定义,NUMBER
确实如此不存储前导零。当然,您可以这样做,但这很不寻常。
也就是说,您可以使用“fm009”格式掩码从数字序列中生成恰好包含 3 个字符的字符串(需要“fm”位以确保您不会获得额外的空格——您可以@ 987654324@ 也是TO_CHAR
调用的结果,省去了掩码的“fm”位)。
SQL> create table t( col1 varchar2(3) );
Table created.
SQL> create sequence t_seq;
Sequence created.
SQL> ed
Wrote file afiedt.buf
1 insert into t
2 select to_char( t_seq.nextval, 'fm009' )
3 from dual
4* connect by level <= 10
SQL> /
10 rows created.
SQL> select * from t;
COL
---
004
005
006
007
008
009
010
011
012
013
10 rows selected.
【讨论】:
哇,非常感谢,非常清楚。但是,我仍然对 fm009 是什么感到困惑。为什么是009?我也看不出 3 位数的限制来自哪里。 @NoobyBooby - '009' 格式掩码表示“将数字转换为长度为 3 个字符且前导 0 填充的字符串”。 'fm' 格式掩码表示“删除通常保留的前导空格,以便在报告中正确对齐负数”。如果你想要一个用 0 填充的 4 个字符的字符串,你会使用 'fm0009'。 除了贾斯汀的优秀帖子之外,我只想补充一点:数据是否总是数字的? 3 位数字和前导零是显示要求,对吗?如果是这样,我认为您应该将序列值存储在表中的 NUMBER 数据类型中,然后在输出时使用 TO_CHAR() 函数来适当地格式化数据。 一些注意事项:1) 1000 个不同的值并不多,尤其是因为序列不是无间隙的。 2)一旦序列t_seq.nextval
高于999,to_char(t_seq.nextval, 'fm009') will return
####. 3) You can control the range of the sequence, when created, like so:
create sequence test_seq minvalue 0 maxvalue 999 cycle;`将cycle
更改为nocycle
,以防止序列发出更多相同的值不止一次。【参考方案2】:
有段时间没用过plsql了,来看看吧:
给定一个整数序列myseq,
to_char(myseq.nextval, '009')
【讨论】:
@Johhy Cundall - 请注意,您可能想要“fm009”而不仅仅是“009”。否则,Oracle 将添加一个额外的前导空格,这样如果您传入一个负数,它就可以在保持对齐的同时为减号留出空间。 009是数字格式模型。你可以在这里阅读docs.oracle.com/cd/B19306_01/server.102/b14200/…【参考方案3】:您也可以使用 lpad 功能。
在 Oracle/PLSQL 中,lpad 函数用一组特定的字符填充字符串的左侧。
例如:
lpad('tech', 7); would return ' tech'
lpad('tech', 2); would return 'te'
lpad('tech', 8, '0'); would return '0000tech'
lpad('tech on the net', 15, 'z'); would return 'tech on the net'
lpad('tech on the net', 16, 'z'); would return 'ztech on the net'
在您的示例中,您将使用
lpad('tech', 8, '0'); would return '0000tech'
即如果字符串长度小于 8 个字符,则在字符串的开头添加 0,直到字符串长度为 8 个字符。
参考:http://www.techonthenet.com/oracle/functions/lpad.php
另外,要将 0 添加到右侧,您可以使用 rpad 函数。
【讨论】:
以上是关于带有 PL SQL 的序列的主要内容,如果未能解决你的问题,请参考以下文章
带有 where 条件的 PL/SQL 更新查询作为带有一些空值的选择查询