带有 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 的序列的主要内容,如果未能解决你的问题,请参考以下文章

pl / sql触发器改变序列

PL/SQL 使用声明的值来设置序列开始 [重复]

带有 where 条件的 PL/SQL 更新查询作为带有一些空值的选择查询

重置自动递增序列 pl-sql

sql Oracle PL / SQL填充排序顺序列中的空白

用于在表上自动生成 ID 的序列和触发 PL/SQL 脚本