Oracle的默認值處理要當心,如果應用中使用的是ORM工具,則必須要考慮對於字段為Null的處理,必要時在ORM工具中將Null轉換為default或插入時去掉值為Null的字段。
可以將下面的系統屬性作為默認值:
SYSDATE:系統時間
SYS_CONTEXT:系統上下文
USER:當前數據庫用戶
USERENV:用戶環境變量,可以獲取一些IP地址、協議、終端的信息
需要注意,默認值不能使用LEVEL、PRIOR、ROWNUM,會報ORA-00976錯誤。
應用中使用默認值的常見場景是主鍵或自增列。正如我們所知,Oracle並未提供自增類型,這就需要我們結合默認值進行二次開發,通過默認值實現系統應用的透明。這里結合筆者的經驗,提供兩種方案:
觸發器+序列
因為Oracle不支持在default中使用序列,因此我們只能使用觸發器來實現。
如果你工作中用到了Oracle,你必須要留意NULL和空值的處理與SQL Server上的不同.現在讓我們看些例子。
建立這張數據庫表並插入記錄
CREATE TABLE TestNull(Col2 VARCHAR(100));
INSERT INTO TestNull VALUES(NULL);
INSERT INTO TestNull VALUES('Bla');
INSERT INTO TestNull VALUES('');
INSERT INTO TestNull VALUES(' ');
如你所見我們插入了4條記錄,一條記錄是null,一條記錄是空值,一條記錄是空格,一條記錄是"Bla".
讓我們執行下面的查詢語句:
SELECT Col2,
NVL(Col2,'EmptyOrNull') a,
COALESCE(Col2,'EmptyOrNull') b,
ASCII(col2) c
FROM TestNull;
看看發生了什么,Oracle把空值轉變成了 NULL。
Coalesce函數的差別
要知道coalesce 函數工作原理不一樣. Oracle沒有isnull函數但有nvl函數來取代。
運行下面2句sql。
SELECT NVL('','No') AS a FROM dual;
SELECT COALESCE('','No') AS a FROM dual;
在這2種情況下你得到“No”返回值, 如你所見空值被當做null處理.
知道了Oralce和SQL Server的這些差別,如果你認為他們工作原理相同你會得到些奇怪的查詢結果。
今天突然才發現,Oracle中的“不等於操作符”是忽略Null的。
比如,查詢comm不等於的300的記錄,我會理所當然地使用where comm != 300
預想會返回包含Null的不等於300的記錄(意識里認為Null也是“不等於30”的其中一種情況)。
而實際上,它只返回不為Null且不等於300的記錄,見如下測試。
事實上,並不僅僅“不等於號”與Null的關系是如此的,其他操作符也類似,只不過“不等於號”使用場景的特殊性讓我們容易發覺此特性。
create table t1(name varchar2(20),year number); insert into t1 values('t12001',2001); insert into t1 values('t12002',2002); insert into t1 values('t12003',2003); insert into t1 values('t12004',2004); insert into t1 values('t12005',null); insert into t1 values('t12006',2006); insert into t1 values('t12007',null); insert into t1 values('t12008',2008); insert into t1 values('t12009',2009); insert into t1 values('t12010',2010); --下面這樣是查不到空的行 select * from t1 where year !=2001 --要么下面這個 select * from t1 where year !=2001 or year is null; --要么下面這個,這個更方便 select * from t1 where lnnvl(year = 2001); LNNVL provides a concise way to evaluate a condition when one or both operands of the condition may be null. lnnvl提供一個簡明的方式來計算一個條件,當一個或條件的兩個操作數可能為空時 concise adj. 簡明的,簡潔的