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