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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- NTMySQL中varchar和char型別的區別heeMySql型別
- const char* 型別不能用於初始化char* 型別實體型別
- PL/SQL基本結構---PLSQL複合型別---表型別變數tableSQL型別變數
- PL/SQL第一章--概述及變數型別SQL變數型別
- 【C++】CONST CHAR*型別的值不能用於初始化CHAR*型別的實體C++型別
- E0144 "const char *" 型別的值不能用於初始化 "char *" 型別的實體型別
- 【筆記】VS2017中出現 "const char *" 型別的值不能用於初始化 "char *" 型別的實體筆記型別
- VS中”LPTSTR" 型別的值不能用於初始化 "char *" 型別的實體型別
- [20240607]PL/SQL中sql語句的註解.txtSQL
- 【VS2019 C++】"const char *" 型別的值不能用於初始化 "char *" 型別的實體C++型別
- VS C++ 2017中const char* 型別的值不能用於初始化char*的解決C++型別
- Oracle PL/SQL程式碼中的註釋OracleSQL
- Python工作筆記-往dll中傳入char*型別的引數並且如何接收char*的值Python筆記型別
- 當char型變數遇上char*型的指標變數指標
- MySQL中資料型別(char(n)、varchar(n)、nchar(n)、nvarchar(n)的區別)MySql資料型別
- PL/SQL 宣告SQL
- Oracle PL/SQLOracleSQL
- 關於VS2017中const char *不能用於初始化char *型別的實體的問題型別
- C# - char型別的一些介紹C#型別
- MySQL資料型別操作(char與varchar)MySql資料型別
- VS2019【C++報錯】E0144"const char *" 型別的值不能用於初始化 "char *" 型別的實體C++型別
- Rust中 String、str、&str、char 的區別Rust
- pl/sql to_dateSQL
- PL/SQL 運算子SQL
- PL/SQL 條件SQL
- PL/SQL 迴圈SQL
- PL/SQL 遊標SQL
- VS2019中出現E01104“const char *”型別的值不能用於初始化“char *”型別的實體的錯誤的解決辦法型別
- CString與LPCWSTR、LPSTR、char*、LPWSTR等型別的轉換型別
- MySQL中CHAR和VARCHAR區別MySql
- Java char 型別究竟佔幾個位元組?Java型別
- std::cout 輸出 unsigned char型別資料型別
- const char*, char const*, char*const 有何區別?
- C++中string、char *、char[]、const char*的轉換C++
- C++中出現《E0144 "const char *" 型別的值不能用於初始化 "char *" 型別的實體》的錯誤解決方法C++型別
- Oracle 的PL/SQL語言使用OracleSQL
- SQL的連線型別SQL型別
- 使用PL/SQL找到兩個表中的相似值FKSQL
- 【OracleEBS】 在PL/SQL中呼叫Oracle ERP請求OracleSQL