随笔分类 -  Oracle细节

摘要:在Oracle中,有一个很有趣的东西,那就是rownum。当你从某个表中查询数据的时候,返回的结果集中都会带有rownum这个字段,而且有时候也可以使用rownum进行一些条件查询。 在查询中,我们可以注意到,类似于“select xx from table where rownum < n”(n>1)这样的查询是有正确含义的,而“select xx from table where rownum = n”这样的查询只在n=1的时候成立,“select xx from table where rownum > n”(n>1)这样的查询只能得到一个空集。另外“select 阅读全文
posted @ 2013-02-04 09:36 water0504 阅读(308) 评论(0) 推荐(0)
摘要:1、通过创建临时表可以把数据先导入到一个临时表中,然后删除原表的数据,再把数据导回原表,SQL语句如下: creat table tbl_tmp (select distinct* from tbl); truncate table tbl;//清空表记录 insert into tbl select * from tbl_tmp; //将临时表中的数据插回来。这种方法可以实现需求,但是很明显,对于一个千万级记录的表,这种方法很慢,在生产系统中,这会给系统带来很大的开销,不可行。2、利用rowid在oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了 阅读全文
posted @ 2012-12-09 15:37 water0504 阅读(1223) 评论(0) 推荐(0)
摘要:在处理插入时间类型的数据用这种方式 :INSERT INTO A(DAT) VALUES(TO_DATE(...)) 当值非空时,可以顺利进行,但是当传入的是空字符穿就有问题, 1.插入时间最小值0001-1-1 2.把这个字段设为可空如:insert into table(date) values(null) 阅读全文
posted @ 2012-08-30 22:45 water0504 阅读(6712) 评论(0) 推荐(0)
摘要:1.请问在ORACLE中对于varchar2型, ' '(空字符串)是否等于NULL? 2.在ORACLE中假如一个varchar2型字段不允许为空,但是有默认值,向这个字段中插入NUll时系统是返回错误还是插入默认值?1.yes 2.如果你语句中插入null,会报错的。如果,你不在插入语句中没有对该列给值,它将使用默认值。查询NULL要用is null 而不是用=null如下面例子:update table1 set col1 = null; 等价于 update table1 set col1 = ' '; 而 select col1 fro... 阅读全文
posted @ 2012-08-30 22:42 water0504 阅读(2850) 评论(0) 推荐(1)
摘要:1.varchar2把所有字符都占两字节处理(一般情况下),varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节;2.VARCHAR2把空串等同于null处理,而varchar仍按照空串处理;3.VARCHAR2字符要用几个字节存储,要看数据库使用的字符集,大部分情况下建议使用varchar2类型,可以保证更好的兼容性。 阅读全文
posted @ 2012-08-30 22:35 water0504 阅读(674) 评论(1) 推荐(1)
摘要:一) 用Oracle Exists替换DISTINCT: 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。一般能够考虑用Oracle EXIST替换,Oracle Exists使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立即返回结果。例子: SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO;SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE Exists(SELECT ‘X& 阅读全文
posted @ 2012-08-26 09:07 water0504 阅读(3532) 评论(0) 推荐(0)
摘要:当使用'for update' 造成表锁住了.可以用DBA登陆按照下面步骤: 1.查看哪个表被锁: select b.owner,b.object_name,l.session_id,l.locked_modefrom v$locked_object l, dba_objects bwhere b.object_id=l.object_id; 2.查看被锁表的sid 和serial# : select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1 阅读全文
posted @ 2012-08-19 15:02 water0504 阅读(1190) 评论(0) 推荐(0)
摘要:首先,我对这个问题做一个进一步的描述,问题是这样的:在oracle中有一个表id是自动增长的,插入一条记录后,我怎样能获取到这个id呢,前提是,这个表中只有id能唯一标识这一行,其他字段都不行,而自动增长的id我又不知道他是多少,如何得到这个id的值呢。首先我想到的是用max(rownum)获取,但是这个是不行的,因为这个表有多个人操作,也就是说我在添加一条记录的同时不能保证其他人是否也同时添加了几条记录,我无法保证表中我添加的这条记录是最新的,所以就得想别的办法。介绍一下sequence(序列),这个可以解决我所描述的这个问题。、首先要创建一个sequence: create sequenc 阅读全文
posted @ 2012-08-16 22:30 water0504 阅读(331) 评论(0) 推荐(0)