PL/SQL中char型別的暗門

regonly1發表於2010-11-08
在PL/SQL程式設計中,char型別是一個比較雞肋的型別,除非是在CPU要求非常高的系統,否則這種型別完全可以用varchar2來替換。
測試案例:
SQL> declare
  2      v_chr1 char(2) := '  ';
  3      v_chr2 char(2) := '';
  4      v_chr3 char(2) := null;
  5  begin
  6      dbms_output.put_line('chr1: ' || length(v_chr1));
  7      dbms_output.put_line('chr2: ' || length(v_chr2));
  8      dbms_output.put_line('chr3: ' || length(v_chr3));
  9  end;
 10  /
 
chr1: 2
chr2: 2
chr3:
 
PL/SQL procedure successfully completed
 
 說明:上面這個過程,給v_chr1、v_chr2、v_chr3分別賦予了兩個空格、空字串、null值,在輸出的結果中,可以看到,v_chr1長度為2,而v_chr2長度為2,而v_chr3的長度為空。到目前為止,我們可以推出v_chr2和v_chr3實際是為空的字串,但是下面實驗卻與之前矛盾:
SQL> declare
  2      v_chr2 char(2) := '';
  3      v_chr3 char(2) := null;
  4  begin
  5      dbms_output.put_line(case v_chr2 when null then 0 else 1 end);
  6      dbms_output.put_line(case v_chr3 when null then 0 else 1 end);
  7  end;
  8  /
 
1
1
 
PL/SQL procedure successfully completed
這個過程做了一個條件測試,如果為空,則列印0,否則列印1。結果顯示為1,即表明這兩個變數都不是空的。此時,我們延伸出空字串和null在變數的賦值中並不是所有情況都相同的。
char型別的這個暗門,在此處已經不容易被看出來,還有中情況更難識別,比如說有表:
tab(x char(2));
在呼叫中,與tab.x繫結型別:
declare
    x tab.x%type;
begin
    dbms_output.put_line(length(x));
end;
這個時候,就更難看出來了。有時候,這種問題會直接導致程式碼目的與實際所需要達到的要求背離。

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

相關文章