PLSQL Language Reference-PL/SQL資料型別-SQL資料型別-CHAR和VARCHAR2變數

LuiseDalian發表於2014-03-09

0.1.1 CHARVARCHAR2變數

(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)對多位元組字元宣告變數

CHARVARCHAR2變數的最大值是32767位元組,不管你是以字元還是位元組指定最大值。在變數中儲存的最大字元數取決於字符集,有時也依賴於字元本身。

單位元組字符集

32767

n位元組定寬字符集

FLOOR(32, 767/n)

n位元組變寬字符集

FLOOR(32, 767/n)32767

當宣告CHARVARCHAR2變數時,為了確保在任何字符集下都能儲存n個字元,要以字元的形式來指定它的大小CHAR(n CHAR), VARCHAR2(n CHAR)n不要超過FLOOR(32767/4) = 8191

3CHARVARCHAR2的區別

I 預定義的子型別

CHARACTER

VARCHAR(SQL,  PL/SQL),  STRING(PL/SQL)

II 記憶體分配

CHAR在編譯時分配的記憶體為最大值。

VARCHAR2記憶體分配依賴於最大值:如果最大值 < 4000位元組,在編譯時根據最大值分配記憶體;如果是大值 >= 4000位元組,根據實際值分配記憶體。

a VARCHAR2(3999);

b VARCHAR2(4000);

--如果將一個500位元組的值賦值給ab,在編譯時給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個為VARCHAR2NVARCHAR2型別,則採用無填充比較語義,否則採用空白填充比較語義。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1104099/,如需轉載,請註明出處,否則將追究法律責任。

相關文章