飞's profile二月飞雪BlogListsGuestbook Tools Help

二月飞雪

科技成就生活之美
感谢访问!
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.
shen lingwrote:
我是第一个? 恩!  占沙发,学习王博 博文
Sept. 4
July 11

global_names='TRUE'时创建非同名的DB Linker会报错

由于创建高级复制的需要,把两台DB Server的global_names都设置成了TRUE,但是一个问题随之而来,当创建一个名称不同于DB Server名的DB Linker时不成功,比如DB Server1的全称是DB1.CHN.COM,那么如果我建立一个名为DB1S1.CHN.COM的DB Linker时会发现不成功,使用select * from global_name@DB1S1.CHN.COM时返回一个DB1S1.CHN.COM指向DB1.CHN.COM的错误,如果创建的DB Linker名跟DB Server1的全称DB1.CHN.COM一样的话,那就没错了。这就意味着无法创建不同连接帐号的DB Linker了,这显然不符合需要,这时想起来在配制高级复制时可以创建后缀@XXX的DB Linker,于是尝试创建了一个名为DB1.CHN.COM@S1的DB Linker,一测试成功了,但是奇怪的时Sql Navigator的DB Linker创建画面不支持这种命名方式,只能手动用脚本创建了。
June 20

用RegularExpressionValidator来限制多行文本的输入长度

以前限制多行文本输入框的输入长度一般采用客户端脚本的方式,最近突然想到用RegularExpressionValidator也可以,只要设定好ValidationExpression就行了,比如你要限定最多只能输入500个字符,那么可以设为:".{0,500}",使用验证控件还能够统一验证与提示的方式,提高友好性。但是今天突然发现一个问题,就是当输入过程中敲入回车键以后,这种验证就不准确了,很离奇,经过尝试发现原来是ValidationExpression设置错误,因为.不能代表特殊字符,所以就不能验证回车,TAB等输入,考虑到TAB本来就无法输入,因此将ValidationExpression设置为:"(.|\r|\n){0,500}"就可以了。
June 07

从另一个表批量更新一个表的多个栏位

情形:从Table B更新Table A中对应行的多个栏位,我已知的一种写法如下:
update A x
set x.v1 = (select y.v1 from B y where y.id = x.id),
     x.v2 = (select y.v2 from B y where y.id = x.id),
     x.v3 = (select y.v3 from B y where y.id = x.id),
     ... ...
这种写法,不但繁琐,而且执行效率比较低,今天得知另外一种写法,简洁而且高效:
update A x
set (x.v1, x.v2, x.v3) = (select y1.v1, y1.v2, y1.v3 from B y1 where y1.id = x.id)
where exists (
    select 1 from B y2 where y2.id = x.id
    )
当然第一种写法有它的其他功效,比如当每个要更新的栏位的对应行不一致时.

Oracle里Null值栏位的查询

我们都知道Oracle里的Null值在输入输出时等效于''(空字符串),但是今天发现在Null值查询时却不能简单地把它等同于'',下面是实验过程:
1,建立一个表test
CREATE TABLE test
    (a                              VARCHAR2(1))
/
2,插入三笔记录
INSERT INTO test values (1);
INSERT INTO test values ('');
INSERT INTO test values (2);
3,执行查询SELECT * FROM test WHERE a not in (1);返回如下:
Row # A
      1  2
注意没有将A为Null的那条记录查出来
4,执行查询SELECT * FROM test WHERE a in ('', 1);或者SELECT * FROM test WHERE a in (NULL, 1);返回均如下:
Row # A
      1  1
另外Null值栏位也不遵循条件比对,比如TableA.Column1 <> TableB.Column1,所有栏位值为Null的都不能被查出.
关于解决方法,首先当然是把Null值情形也作为条件写进去,比如:SELECT * FROM test WHERE a not in (1) or a is null;
另外对于一些比较复杂的查询场合,可以先建立一个View,用NVL函数将所有Null值转换为一个无意义的数据,这样方便后面的查询和统计.
December 26

关于Oracle的临时表

Oracle的临时表跟Sql Server的临时表有很大的不同,Sql Server的临时表用完就没了,而Oracle的临时表是实际存在的,就是说它的结构不是临时的,而数据时临时的,一般是先创建后使用,它的数据有两种临时特性,一种是Transaction级别的,Transaction一结束,这次Transaction所插入的数据就没有了,另一种是Session级别的,直到Session消失,它所插入的数据都一直存在。今天Zaza在实验Oracle的临时表的时候发现一个奇怪的现象,就是:
1、Create Global Temporary Table t1 on commit delete rows
    As
    Select * From t;
2、Create Global Temporary Table t2 on commit preserve rows
    As
    Select * from t;
第一种方法创建临时表t1后,发现select * from t1没有记录,而第二种方法创建临时表t2后,发现select * from t2是有记录的,难道Create Table t As Select这种建表方法本身就包含了一笔Transaction吗?我想应该是的,不然不会出现以上的情况,我就这个问题和自己的理解请教了我在Oracle University培训时的讲师,没能得到肯定完整的答复,不过我基本确定我的理解应该是正确的:)
 
No list items have been added yet.

Custom HTML