PL/SQL的几个概念区别
PL/SQL的几个概念区别1:char 和 varchar2的区别:varchar2 :variable-length 变长char : fixed-length 固定长度char定义的时候分配内存,而varchar2动态分配内存下面一个例子明确的说明了这两个的区别 :[sql]SQL> DECLARE2 c CHAR(32767) := ' ';3 v VARCHAR2(32767) := ' ';4 BEGIN5 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> DECLARE2 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 BEGIN9 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> DECLARE2 SUBTYPE code IS CHAR(1 CHAR);3 c CHAR(1 CHAR) := 'A';4 d CODE;5 BEGIN6 d := c;7 END;8 /PL/SQL 过程已成功完成。3: TIMESTAMP 和DATE的区别:TIMESTAMP是DATE的subtype,提供更精确的时间。以下这个例子说明了它们之间的区别:[sql]SQL> DECLARE2 d DATE := SYSTIMESTAMP;3 t TIMESTAMP(8) := SYSTIMESTAMP;4 BEGIN5 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 zoneto the timestamp. The time zone qualifier returns the standard time and an indicator whether thetime zone is using daylight saving time. The local time zone qualifier returns the differencebetween the local time and Greenwich Mean Time (GMT)[sql]SQL> DECLARE2 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 BEGIN7 dbms_output.put_line('var1 ['||var1||']');8 dbms_output.put_line('var2 ['||var2||']');9 dbms_output.put_line('var3 ['||var3||']');10 dbms_output.put_line('var4 ['||var4||']');11 END;12 /var1 []var2 [12-6月 -12 05.51.44.750000 下午]var3 []var4 [12-6月 -12 05.51.44.750 下午]PL/SQL 过程已成功完成。一种有效的方式使用TRUNC(date_variable)函数把系统时间戳[sql]SQL> DECLARE2 d DATE := SYSDATE;3 BEGIN4 dbms_output.put_line(TO_CHAR( TRUNC(d) ,'DD-MON-YY HH24:MI:SS'));5 END;6 /12-6月 -12 00:00:00PL/SQL 过程已成功完成。4:NCHAR 和 CHAR NVARCHAR 和 VARCHAR区别:NCHAR数据类型采用统一字符编码相当于CHAR数据类型,NVARCHAR2数据类型是统一字符编码相当于VARCHAR2数据类型,我们应该使用NCHAR或者NVARCHAR,因为在同样的数据库中将支持多个字符集编码。使用字符编码能够支持多个字符集,AL16UTF16中一个字符占用3个字节 ,UTF8 编码一个字符占用两个字节。NCHAR 和 NVARCHAR是为了统一化字符编码,为以后的扩展用。上一个:oracle导入导出exp,imp命令
下一个:oracle error:Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...解决
- 更多SQLServer疑问解答:
- 配置MSSQL复制指定快照文件夹提示:不是有效的路径或文件名
- 详细解读varchar和Nvarchar区别
- SQL SERVER 2005 同步复制技术
- 进程未能大容量复制到表 解决方法
- MSSql实例教程:MSSql数据库同步
- SQLServer2000同步复制技术实现(分发和订阅)
- sqlserver
- SQLSERVER
- 测试 sqlserver 最大用户数连接
- 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的
- sqlserver2008的安装问题。
- 为什么安装的SQL server 2008我的没有MSSQLSERVER协议啊?
- 怎样把exel表里的数据复制到sqlserver表里
- sqlserver数据库主键和外键问题
- sqlserver 中的左表连接查询和右表连接查询有啥不同?有什么用?