zoukankan      html  css  js  c++  java
  • Oracle 11g 学习笔记 (2)

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

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

  • 相关阅读:
    git常用命令
    Mybatis文档收集
    RocketMQ安装及配置
    vs code 插件收集
    idea中RunDashboard显示
    Error running ‘JeecgSystemApplication‘: Command line is too long. Shorten command line for JeecgSys
    shell脚本 for循环实现文件和目录遍历
    linux一次性解压多个.gz或者.tar.gz文件
    CentOS7挂载磁盘,4T磁盘挂载方法
    windows 安装Nginx服务
  • 原文地址:https://www.cnblogs.com/WizardWu/p/1342174.html
Copyright © 2011-2022 走看看