一些 ASP.NET + Oracle 11g 系統邊寫邊學的隨筆,包括 Oracle 的「批次更新」,以及將 Oracle 內部編碼設定為 Unicode 字元集。
(四) Oracle 的「批次 (batch) 更新」、「批次新增」、「批次刪除」文法
Oracle 仍可如 SQL Server、Sybase 資料庫,用「分號 (;)」隔離多個 SQL statement,只是 Oracle 前後要再加上 begin、end 關鍵詞,例如:
string strSql = "begin insert into table01(id,name) values(99,'test'); insert into table01(id,name) values(99,'test'); end;";
string strSql = "begin update table01 set name='test2' where id=99; update table01 set name='test2' where id=99; end;";
string strSql = "begin delete from table01 where id=99; delete from table01 where id=19; end;";
因 Oracle 文法較嚴謹,不能直接在 SQL 陳述式中,出現「;」等特殊符號。
(五) 讓 Oracle 支援 Unicode 處理
Oracle 11g 剛裝好時,預設的字元集,會無法處理他國語言的文字。若您在 SqlPlus 輸入指令:
SELECT parameter, value FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET';
會看到以下的 NLS_LANG 資訊:
--------------
NLS_CHARACTERSET
ZHT16MSWIN950 (繁體中文) 或
ZHS16GBK (簡體中文)
NLS_NCHAR_CHARACTERSET
AL16UTF16
--------------
接下來,我們要透過「ALTER DATABASE CHARACTER SET」這個指令,去更改 Oracle 內部的字元集編碼方式。
請先在 sqlplus 程式中,用 sysdba 角色進入,指令如下:
connect sys/密碼 as sysdba;
接著再輸入下列指令,執行完後即會自動執行轉換的工作:
shutdown immediate;
STARTUP MOUNT;
ALTER SESSION SET SQL_TRACE=TRUE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE character set INTERNAL_USE AL32UTF8;
ALTER SESSION SET SQL_TRACE=FALSE;
shutdown immediate;
startup;
這種方式可能會造成 Oracle 內,既有的儲存資料錯亂和遺失,在執行上述指令前,最好要先做備份資料的工作。
接下來,再執行一次下列指令,察看 NLS_LANG 資訊:
SELECT parameter, value FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET';
NLS_LANG 資訊已經變成:
--------------
NLS_CHARACTERSET
AL32UTF8
NLS_NCHAR_CHARACTERSET
AL16UTF16
--------------
此外,網路上廣為流傳的用這種方法是不正確的:
update props$ set value$='AL32UTF8' where name='NLS_CHARACTERSET';
透過前述正確的「ALTER DATABASE CHARACTER SET」指令,去更改 characterset 後,Oracle 至少會更改 12 張 data dictionary;但若透過這種直接更新 props$ 表的方式,則只完成了其中十二分之一的工作,其潛在的完整性及隱憂可想而知。
若我們要用 ASP.NET 應用程式去擷取、寫入 Oracle 時,若有日文字、他國文字時,除了要先如上述把 Oracle 內部的字元集改成 Unicode 外,
在 ADO.NET 的聯機方式也要注意。以 Visual Studio 2005 來說,其內建的 OleDb Data Provider 用來聯機 Oracle 11g 時,並無法正確處理 Unicode 中的特殊字元和他國文字,甚至在寫入 Oracle 時,會出現以下錯誤:
因為加號或減號不符合或資料溢位之外的原因,無法轉換命令 parameter[1]'' 資料值。 id: 0
解決方式,是改用 OracleClient Data Provider,或用 Oracle 官方的 OleDb Data Provider,下載點為:
http://www.oracle.com/technology/software/tech/windows/ole_db/index.html
http://www.oracle.com/technology/software/tech/windows/odpnet/index.html
=================
參考檔案:
http://www.monster.com.tw/archives/471
http://www.javaworld.com.tw/jute/post/view?bid=21&id=137350&sty=1&tpg=2&age=0
http://blog.roodo.com/mywork/archives/6198547.html
=================