PL/SQL的几个概念区别(一)

2014-11-24 13:06:40 · 作者: · 浏览: 1
PL/SQL的几个概念区别
1:char 和 varchar2的区别:
varchar2 :variable-length 变长
char : fixed-length 固定长度
char定义的时候分配内存,而varchar2动态分配内存
下面一个例子明确的说明了这两个的区别 :
[sql]
SQL> DECLARE
2 c CHAR(32767) := ' ';
3 v VARCHAR2(32767) := ' ';
4 BEGIN
5 dbms_output.put_line('c is ['||LENGTH(c)||']');
6 dbms_output.put_line('v is ['||LENGTH(v)||']');
7 v := v || ' ';
8 dbms_output.put_line('v is ['||LENGTH(v)||']'); END;
9 /
c is [32767]
v is [1]
v is [2]
PL/SQL 过程已成功完成。
输出的结果显示:CHAR类型变量在定义的时候分配内存,分配的内存也可能超过变量定义的大小,VARCHAR2类型变量动态分配内存,根据设置的变量的大小。
下面的例子也说明这一点:
[sql]
SQL> DECLARE
2 c CHAR(32767) := ' ';
3 v VARCHAR2(32767) := ' ';
4 var1 CHAR := ' '; -- Implicitly sized at 1 byte.
5 var2 CHAR(1) := ' '; -- Explicitly sized at 1 byte.
6 var3 CHAR(1 BYTE) := ' '; -- Explicitly sized at 1 byte.
7 var4 CHAR(1 CHAR) := ' '; -- Explicitly sized at 1 character.
8 BEGIN
9 dbms_output.put_line('c is ['||LENGTH(c)||']');
10 dbms_output.put_line('v is ['||LENGTH(v)||']');
11 dbms_output.put_line('var1 is ['||LENGTH(var1)||']');
12 dbms_output.put_line('var2 is ['||LENGTH(var2)||']');
13 dbms_output.put_line('var3 is ['||LENGTH(var3)||']');
14 dbms_output.put_line('var4 is ['||LENGTH(var4)||']');
15 v := v || ' ';
16 dbms_output.put_line('v is ['||LENGTH(v)||']'); END;
17 /
c is [32767]
v is [1]
var1 is [1]
var2 is [1]
var3 is [1]
var4 is [1]
v is [2]
2:character 和 char的区别:
CHARACTER类型是CHAR的subtype,CHARACTER类型和它的基类优相同的大小,在CHAR和CHARACTER数据类型之间隐式转换。以下是一个subtype的定义:
SUBTYPE subtype_name IS base_type[(maximum_size [BYTE | CHAR])] [NOT NULL];
应用例子:
[sql]
SQL> DECLARE
2 SUBTYPE code IS CHAR(1 CHAR);
3 c CHAR(1 CHAR) := 'A';
4 d CODE;
5 BEGIN
6 d := c;
7 END;
8 /
PL/SQL 过程已成功完成。
3: TIMESTAMP 和DATE的区别:
TIMESTAMP是DATE的subtype,提供更精确的时间。
以下这个例子说明了它们之间的区别:
[sql]
SQL> DECLARE
2 d DATE := SYSTIMESTAMP;
3 t TIMESTAMP(8) := SYSTIMESTAMP;
4 BEGIN
5 dbms_output.put_line('DATE ['||d||']');
6 dbms_output.put_line('TO_CHAR ['||TO_CHAR(d,'DD-MON-YY HH24:MI:SS')||']
');
7 dbms_output.put_line('TIMESTAMP ['||t||']');
8 END;
9 /
DATE [12-6月 -12]
TO_CHAR [12-6月 -12 17:50:17]
TIMESTAMP [12-6月 -12 05.50.17.40600000 下午]
PL/SQL 过程已成功完成。
注意:TIMESTAMP(8)代表精确度,你可以通过修改这个值看输出结果
时间区没有用到,不知道有什么作用,以下是改写的例子:
PL/SQL programing上这样说的:
The difference between these timestamps is that those with time zones append the time zone
to the timestamp. The time zone qualifier returns the standard time and an indicator whether the
time zone is using daylight saving time. The local time zone qualifier returns the difference
between the local time and Greenwich Mean Time (GMT)
[sql]
SQL> DECLARE
2 var1 TIMESTAMP WITH LOCAL TIME ZONE;
3 var2 TIMESTAMP WITH LOCAL TIME ZONE := SYSTIMESTAMP;
4 var3 TIMESTAMP(3) WITH LOCAL TIME ZONE;
5 var4 TIMESTAMP(3) WITH LOCAL TIME ZONE := SYSTIMESTAMP;
6 BEGIN
7 dbms_output.put_line('var1 ['||var1||']');
8 dbms_output.put_line('var2