很久没有用到Oracle了,前些日子单位接了一个Oracle数据库的项目,自然需要复习一下,现将复习过程中的一些要点记录下来,以备查阅。
一、 表列数据类型
1、字符
1) VARCHAR2(n),n是必须的,用于存储最长为4000个字符的字符串。但它是可变的,只使用所需要的最少字节。
2) CHAR(n),n是必须的,用于存储固定长度的字符串。如果所插入的值小于CHAR所声明的长度,则右边以空格填充。一般不用该类型
3) NCHAR(n), NVARCHAR2(n),仅用于存储Unicode字符集
2、数字
1) NUMBER, NUMBER(a), NUMBER(a, b)
2) 这种类型用于存储数字,不要使用精确的参数来存储未知范围的值。如Create table temp(amout number),则可以在列amout中存储实际上是任意大小的数字。
3) 参数a代表精度,即占位符的总位数,参数b表示刻度,即小数点右边的位数。如Create table temp(age number(3))表示可以存储任意3位的整数;如果要存储股票价格,其最大值为100万美元(小数点左边有7位),小数点右边有4位,则可以使用Create table temp(price number(11,4))
4) 刻度是可选的,如果没有这个参数,则值将作为整数存储。对于分数,在插入时将被四舍五入为最接近的整数。如果只指定刻度,则可以使用Create table temp(price number(*,4))
3、日期类型
1) DATE,用于存储日期和时间,默认显示格式为DD-MON-YY
2) TIMESTAMP派生于DATE,它可以表示与DATE具有相同精度的时间,并包括秒的小数部分
二、 序列
各种数据库以不同的方式来处理列的自动生成,SQL Server使用一个IDENTITY列,而ORACLE则使用序列。序列是一个对象,该对象存储在数据字典中。序列一直保留状态信息,如当前值,而其上下文是在数据字典中维护的。
1、序列的属性:NEXTVAL,求出接下来的最高值;CURRVAL,最近一次调用NEXTVAL时返回的值。
2、创建序列时,序列数字可以是循环的,或者是在某个最大值那里停下来。与之对应的关键字分别是CYCLE和NOCYCLE。INCREMENT BY 间距(interval)可以使序列按照任何整数的倍数来增加,默认是1。为了提高性能,CACHE选项预先在内存中为一些数字分配了缓存。下面创建了一个序列,该序列在0,5,10,15,20这几个值之间循环,到了20后便重新回到0。
CREATE SEQUENCE sample_sequence
MINVALUE 0
START WITH 0
MAXVALUE 20
INCREMENT BY 5
NOCACHE
CYCLE;
3、序列数字不会与任何一个表联系在一起,在表与序列之间没有任何的依赖关系。如果删除并重新创建一个序列,或许可以使用这个序列使存储过程暂时无效。而重新创建序列后,存储过程需要重新编译,并且在运行时生效。
4、一旦创建了一个序列,就可以使用它来填充表中的任何一列,故有必要小心地为序列命名,使其能反映它们的用途,同时限定序列的目的是为了填充某一特定的列。
5、用途举例:一个学生编号列STUDENT_ID VARCHAR2(10),假设我们希望该列数据以A开头,后接9位数字。因此我们声明一个9位的序列,从1到999,999,999,然后将前缀字母与这个字符串连接起来。CREATE SEQUENCE语句将会首先使用这些限制来声明MINVALUE和MAXVALUE,然后用左补零函数来处理:’A’ || LPAD(student_id.NEXTVALUE, 9, ‘0’)