WizardWu 編程網

一位台灣的工程師,接觸 .NET 逾十年,近年研究 SQL Server、Performance Tuning、手機應用

博客园 首页 新随笔 联系 订阅 管理

一些 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

=================

posted on 2008-11-27 13:09  WizardWu  阅读(3650)  评论(7编辑  收藏  举报