PL/SQL中char型別的暗門
在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;
這個時候,就更難看出來了。有時候,這種問題會直接導致程式碼目的與實際所需要達到的要求背離。
測試案例:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PLSQL Language Reference-PL/SQL資料型別-SQL資料型別-CHAR和VARCHAR2變數SQL資料型別變數
- Pl/SQL 自定義型別SQL型別
- pl/sql記錄型別SQL型別
- pl/sql集合型別(一)SQL型別
- PLSQL Language Reference-PL/SQL資料型別-SQL資料型別-使用者定義的PL/SQL子型別SQL資料型別
- pl/sql集合型別_varray(二)SQL型別
- NTMySQL中varchar和char型別的區別heeMySql型別
- PL/SQL 中如何正確選擇遊標型別SQL型別
- 在PL/SQL中使用日期型別SQL型別
- PL/SQL複合資料型別SQL資料型別
- PLSQL Language Reference-PL/SQL資料型別-SQL資料型別-有限制的子型別SQL資料型別
- ABAP中Char型別資料轉換成Decimal型別型別Decimal
- 應用中避免使用char/nchar型別型別
- 聊聊Oracle 11g中的char型別使用Oracle型別
- 避免使用Oracle的char型別Oracle型別
- PLSQL Language Reference-PL/SQL資料型別-SQL資料型別-不同的最值大小SQL資料型別
- PL/SQL中command window與SQL window的區別SQL
- PL/SQL入門SQL
- const char* 型別不能用於初始化char* 型別實體型別
- char型別的數值轉換型別
- VS中”LPTSTR" 型別的值不能用於初始化 "char *" 型別的實體型別
- 全面探討PL/SQL的複合資料型別(轉)SQL資料型別
- 【C++】CONST CHAR*型別的值不能用於初始化CHAR*型別的實體C++型別
- 客戶編號分配中,PL/SQL型別自動轉換問題SQL型別
- PLSQL Language Reference-PL/SQL資料型別-SQL資料型別-LONG和LONG RAW變數SQL資料型別變數
- SQL插入語句中有單引號 && SQL中char nchar varchar nvarchar的區別 && Java中字元(串)和數值型別的轉換SQLJava字元型別
- pl/sql中的row物件SQL物件
- PLSQL Language Reference-PL/SQL資料型別-SQL資料型別-ROWID和UROWID變數SQL資料型別變數
- PL/SQL基本結構---PLSQL複合型別---表型別變數tableSQL型別變數
- E0144 "const char *" 型別的值不能用於初始化 "char *" 型別的實體型別
- MySQL字元資料型別char與varchar的區別MySql字元資料型別
- PL/SQL第一章--概述及變數型別SQL變數型別
- PLSQL Language Referenc-PL/SQL集合和記錄-集合型別SQL型別
- Oracle的資料型別:char/varchar2Oracle資料型別
- 當char型變數遇上char*型的指標變數指標
- Sql server char,nchar,varchar與Nvarchar的區別SQLServer
- Python工作筆記-往dll中傳入char*型別的引數並且如何接收char*的值Python筆記型別
- "LPWSTR" 型別的值不能用於初始化 "char *" 型別的實體型別