标签归档:Oracle Database

修改 Oracle XE 的CHARACTERSET


从Oracle 11g上导出一些资料至 oracle xe上时,会出现长度不足的情况。经查发现是NLS_CHARACTERSET设置不同导致的。
Oracle XE安装后,默认为AL32UTF8,这样一个中文字符会占用三个字节,而原来的数据库设置为:ZHS16GBK。以下为将Oracle XE上的AL32UTF8改为ZHS16GBK的方法:

以 sysdba 角色 进入sqlplus 之后执行以下命令:

D:\oraclexe\app\oracle\product\10.2.0\server\BIN\sqlplus.exe / as sysdbaSHUTDOWN 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 ZHS16GBK;
ALTER SESSION SET SQL_TRACE=FALSE;

查看Oracle 參數

select * from v$NLS_PARAMETERS

重启数据库

SHUTDOWN IMMEDIATE;
STARTUP;

修改完成后管理界面会乱码,不用管它。

参考:修改 Oracle XE 的CHARACTERSET

JDBC编程中如何判断表是否存在


在java.sql包中有一个这样的接口 DatabaseMetaData接口,通过Connection.getMetaData()我们可以获得这个接口的实现。

接口中有一个getTables方法,返回ResultSet。通过getTables方法我们即可获得指定名称的表。例如:

DatabaseMetaData dmd = conn.getMetaData();
ResultSet rs = dmd.getTables(null, null, “TEST”, null);
if (rs.next) return true;// 指定的表存在

关于getTables参数的含义,大家可以参考javadoc,说得很明白。这里需要提醒的是:在Oracle中,我们使用sql的时候,表名是不区分大小写的,但是getTables中的表名必须使用大写,因为Oracle默认使用大写存储表名,否则会找不到指定的表。

ORA-06553: PLS-307: too many declarations of ‘MD5’ match this call


最近因为项目需要做两个库之间的数据交换,但是因为一些客观原因导致不能使用数据库的高级复制功能,遂想到通过两个中间库 作为数据交换的节点进行数据交换,但是这样子一来,就需要自己处理数据的更新、插入、删除判断了。

插入的数据比较好判断,通过一个表记录数据的主键即可,但是更新的数据怎么判断出来呢?通过调查发现,可以采用记录数据主键以及创建记录数据体的MD5校验码来检查数据是否被更新了。

Oracle本身提供了一个md5函数可以生成文本的md5值,连接数据执行

select dbms_obfuscation_toolkit.md5(‘test’) from dual;

居然显示ORA-06553: PLS-307: too many declarations of ‘MD5’ match this call错误,上网一查,发现需要指明接收的参数名称。通过下面的方法可以解决该问题。

select dbms_obfuscation_toolkit.md5(input_string => ‘test’) from dual;

增加了input_string类型的参数,至此问题解决。

最近决定往分布式系统架构方向走,得努力了。在卓越买了两本书,一本Java 消息服务,还有一本Spring技术内幕:深入解析Spring架构与设计原理。关于分布式,还是先从消息服务入手,然后再搞定Hadoop的配置和基本开发。Spring方面的话虽然自己一直在用,也经常看一些源代码,并且模仿Spring的设计方法在自己的系统里面做一些实现。但是没有全面的了解,感觉还是不扎实,所以看一下Spring技术内幕全盘掌握Spring的一些技术。

——谨此勉励自己

Oracle table lock的几种模式


Oracle中的锁定可以分为几类:DML lock(data lock),DDL lock(dictionary lock)和internal lock/latch。
DML lock又可以分为row lock和table lock。row lock在select.. for update/insert/update/delete时隐式自动产生,而table lock除了隐式产生,也可以调用lock table <table_name> in </table_name> name来显示锁定。

如果不希望别的session lock/insert/update/delete表中任意一行,只允许查询,可以用lock table table_name in exclusive mode。(X)这个锁定模式级别最高,并发度最小。

如果允许别的session查询或用select for update锁定记录,不允许insert/update/delete,可以用lock table table_name in share row exclusive mode。(SRX)

如 果允许别的session查询或select for update以及lock table table_name in share mode,只是不允许insert/update/delete,可以用lock table table_name in share mode。(share mode和share row exclusive mode的区别在于一个是非抢占式的而另一个是抢占式的。进入share row exclusive mode后其他session不能阻止你insert/update/delete,而进入share mode后其他session也同样可以进入share mode,进而阻止你对表的修改。(S)

还有两种锁定模式,row share(RS)和row exclusive(RX)。他们允许的并发操作更多,一般直接用DML语句自动获得,而不用lock语句。

lockmode Clause

Specify one of the following modes:

ROW SHARE
ROW SHARE permits concurrent access to the locked table but prohibits users from locking the entire table for exclusive access. ROW SHARE is synonymous with SHARE UPDATE, which is included for compatibility with earlier versions of Oracle Database.

ROW EXCLUSIVE
ROW EXCLUSIVE is the same as ROW SHARE, but it also prohibits locking in SHARE mode. ROW EXCLUSIVE locks are automatically obtained when updating, inserting, or deleting.

SHARE UPDATE
See ROW SHARE.

SHARE
SHARE permits concurrent queries but prohibits updates to the locked table.

SHARE ROW EXCLUSIVE
SHARE ROW EXCLUSIVE is used to look at a whole table and to allow others to look at rows in the table but to prohibit others from locking the table in SHARE mode or from updating rows.

EXCLUSIVE
EXCLUSIVE permits queries on the locked table but prohibits any other activity on it.

Examples
LOCK TABLE employees@remote
IN SHARE MODE;