(1) 赋予和插入太长的值
|
--给字符变量赋值,超出了它的最大大小 DECLARE c VARCHAR2(3 CHAR); BEGIN c := 'abc '; END; /
--将字符变量插入到列中,它的值超出了列的大小 DROP TABLE t; CREATE TABLE t (c CHAR(3 CHAR));
DECLARE s VARCHAR2(5 CHAR) := 'abc '; BEGIN INSERT INTO t(c) VALUES(s); END; /
--在将字符串插入到列中之前,使用RTRIM函数去除尾部空格 DECLARE c VARCHAR2(3 CHAR); BEGIN c := RTRIM('abc '); INSERT INTO t(c) VALUES(RTRIM('abc ')); END; / |
(2)对多字节字符声明变量
CHAR和VARCHAR2变量的最大值是32767字节,不管你是以字符还是字节指定最大值。在变量中存储的最大字符数取决于字符集,有时也依赖于字符本身。
|
单字节字符集 |
32767 |
|
n字节定宽字符集 |
FLOOR(32, 767/n) |
|
n字节变宽字符集 |
FLOOR(32, 767/n)~32767 |
当声明CHAR和VARCHAR2变量时,为了确保在任何字符集下都能存储n个字符,要以字符的形式来指定它的大小CHAR(n CHAR), VARCHAR2(n CHAR),n不要超过FLOOR(32767/4) = 8191
(3)CHAR和VARCHAR2的区别
I 预定义的子类型
CHARACTER<-CHAR
VARCHAR(SQL, PL/SQL), STRING(PL/SQL) <- VARCHAR2
II 内存分配
CHAR在编译时分配的内存为最大值。
VARCHAR2内存分配依赖于最大值:如果最大值 < 4000字节,在编译时根据最大值分配内存;如果是大值 >= 4000字节,根据实际值分配内存。
|
a VARCHAR2(3999); b VARCHAR2(4000); --如果将一个500字节的值赋值给a和b,在编译时给a分配3999字节 --b分配500字节 |
即PL/SQL对小的VARCHAR2进行性能优化,对大的VARCHAR2进行有效内存使用方面的优化。
III 空白填充
当赋给变量的值比变量的最大值小,当插入到列中的值比例的宽度小,当从列获取的值比变量的最大值小,如果接收者类型为CHAR,则使用空格填充到最大值,原来的尾部空白信息丢失;如果接收者类型为VARCHAR2,则不填充,没有信息丢失。
|
DECLARE first_name CHAR(10 CHAR); last_name VARCHAR2(10 CHAR); BEGIN first_name := 'John '; last_name := 'Chen ';
DBMS_OUTPUT.PUT_LINE('*' || first_name || '*'); DBMS_OUTPUT.PUT_LINE('*' || last_name || '*');
END;
|
IV 值比较
SQL的字符比较规则适用于PL/SQL字符比较。当2个比较的字符有1个或2个为VARCHAR2或NVARCHAR2类型,则采用无填充比较语义,否则采用空白填充比较语义。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17013648/viewspace-1104099/ ,如需转载,请注明出处,否则将追究法律责任。