2008年8月21日 星期四

Oracle 學習(3) boolean 的資料欄位

忍不住要發點牢騷。在 SQL Server 上,一直嘗試著Follow SQL 92 的標準。裡面有這麼一段
SQL defines distinct data types named by the following key words: CHARACTER, CHARACTER VARYING, BIT, BIT VARYING, NUMERIC, DECIMAL, INTEGER, SMALLINT, FLOAT, REAL, DOUBLE PRECISION, DATE, TIME, TIMESTAMP, and INTERVAL.

因此,bit 的data type 是 SQL 92 的標準。根據此標準,我們可以宣告一個欄位為 bit,此欄位只能存0 或 1 (因為是 bit)。
在 AP 的設計時,就會將該資料視為 boolean 。
範例如下:建立一個測試資料庫及資料表
create database test;
go
use test;
go
create table Emp(id int not null, IsRetired bit not null);
所以,有一個員工編號1號,尚未退休時,就會用下面的sql script 來 insert
insert into dbo.Emp(id, IsRetired) values (1, 0);
接下來,使用 LINQ to Sql 並寫如下的程式,找出所有未退休的員工資料
TestDataContext ctx = new TestDataContext();
var q = from e in ctx.Emps
        where e.IsRetired == false
        select e;

其中, linq to sql 自然就將 IsRetired 欄位當成 boolean 值,0 是 false, 1 是 true. 這在 sql server 是相當自然而沒有疑慮的事情。
那在 Oracle 呢?Oracle 是資料庫的老大,當然不需要 follow 標準。(所以別怪 MS Office 不照 OpenDocument format (ODF) 的標準,而要自行搞一套 Office Open Xml 的標準)
Oracle 不支援 bit 的 datatype,甚至在 Oracle vs. SQL Server中也指明了,bit 的相等的oracle 表達法是 number(1, 0)。
是否我們需要存 boolean 值時,在oracle 就宣告成 number(1, 0) 呢?
將來如果出了一個 linq to oracle 的 privider,是否看到 number(1, 0) 就自行轉成 boolean 呢? 看了很多前人的程式,都是自行定義的,如 char(1),然後寫入值為 '0' 或 '1' ,也有寫成 'Y' 或 'N",當然也有 'y' 或 'n'。
實在令人頭痛。
如果是您,不知道您會如何宣告呢?

沒有留言:

Share with Facebook