以前搜集的一个Oracle比较常见问题的列表,忘记了是从哪来的
关于 SELECT N 问题
有感于一些网友多次咨询和讨论选取某些指定行数据的问题, 我写了下面这样的简单说明, 请大家指正.
这里描述的 SELECT N 包括这样几种情况:
1. 选取TOP N行记录
2. 选取N1-N2行记录
3. 选取FOOT N行记录
当然需要考虑是否有ORDER BY子句的情况, 下面试以系统视图CAT为例分别说明.
注: A. 为没有ORDER BY的情况
B. 有ORDER BY的情况
1. 选取 TOP N 行记录
A. SELECT * FROM CAT WHERE ROWNUM<=N
B. SELECT * FROM
( SELECT * FROM CAT ORDER BY TABLE_TYPE )
WHERE ROWNUM<=N
2. 选取N1-N2行记录
A. SELECT TABLE_NAME,TABLE_TYPE FROM
( SELECT ROWNUM ROWSEQ,TABLE_NAME,TABLE_TYPE FROM CAT )
WHERE ROWSEQ BETWEEN N1 AND N2;
或:
SELECT * FROM CAT WHERE ROWNUM<=N2
MINUS
SELECT * FROM CAT WHERE ROWNUM<N1
B. SELECT TABLE_NAME,TABLE_TYPE FROM
( SELECT ROWNUM ROWSEQ,X.* FROM (SELECT * FROM CAT ORDER BY TABLE_TYPE) X)
WHERE ROWSEQ BETWEEN N1+1 AND N2;
3. 选取FOOT N行记录
这里是说明不知道记录集的记录个数的情况, 如果已知, 用上面2的方法即可
A. SELECT TABLE_NAME,TABLE_TYPE FROM
( SELECT ROWNUM ROWSEQ,TABLE_NAME,TABLE_TYPE FROM CAT )
WHERE ROWSEQ > ( SELECT COUNT(*)-N FROM CAT )
B. SELECT TABLE_NAME,TABLE_TYPE FROM
( SELECT ROWNUM ROWSEQ,TABLE_NAME,TABLE_TYPE FROM CAT ORDER BY TABLE_TYPE)
WHERE ROWSEQ > ( SELECT COUNT(*)-N FROM CAT )
或
SELECT * FROM 
( SELECT TABLE_NAME,TABLE_TYPE FROM CAT ORDER BY TABLE_TYPE DESC) 
WHERE ROWNUM<=N
以上在ORACLE8.1.5 for Windows2000pro 上测试通过
-- end --
oracle FAQ(1) from chao_ping 
1.快速整理破碎的表(在Oracle8i里边才可以这样使用) 
ALTER TABLE table_name MOVE ( TABLESPACE XXX); 
如何移动一张表所在的表空间 
方法一: 
1. Export 这张表 
2. Drop这张表 
3. Create table xxx tablespace xxx; 
4. Imp Ignore=y 
还要注意的一点是,所有要读取这张表的PL/SQL储存过程都会失效。需要重新编译。 
1. SELECT * FROM DBA_OBJECTS WHERE STATUS = 'INVALID'; 
2. 对这些包,函数,过程重新编译。 
方法二: 
仅对Oracle8i适用。 
使用下面的语句: 
ALTER TABLE table_name MOVE 
TABLESPACE new_tablespace; 
这样的话,所有的约束、索引、触发器都不会受到影响。 
但是需要rebuild这个标上的所有索引。 
2.怎样直接进入sql*plus而不用输入用户名,密码: 
sqlplus /nolog; 
sqlplus username/password@connect_string 
3.怎样快速重建索引: 
alter index xxx rebuild storage(); 
alter index xxx coalesce; 
4. 为什么我看不到dbms_output的结果? 
SET SERVEROUTPUT ON 
5. 进行一次大的事务以后,已经COMMIT了,但为什么我的回滚段还是那样大? 
因为没有设置OPTIMAL的值,所以不会自动收缩。 
可以用alter rollback segment shrink to Xm;来手工进行收缩。 
6. 为什么要使用VARCHAR2,而不用CHAR? 
A.CHAR只支持2000字节长,而VARCHAR2支持4000字节的长度,适用性更好 
B. CHAR 占用更多的存储空间,定义多长,它就占用多长的空间,插入字符后面自动加空格填充;而VARCHAR2不论定义多长,都只使用实际插入的长度。 
7. 为什么从不同的数据字典看,表/索引所占用的空间不一样? 
SQL> select blocks , empty_blocks from dba_tables where table_name=’表名'; 
BLOCKS EMPTY_BLOCKS 
---------- ------------ 
1575 1524 
SQL> select bytes,blocks,extents from dba_segments where segment_name='表名'; 
BYTES BLOCKS EXTENTS 
---------- - --------- ---------- 
6348800 3100 1 
这是因为第一个数据库视图DBA_TABLES的BLOCKS列是指实际上使用的BLOCK数目,还有一些BLOCK虽然被占用了,但是没有数据存在,不计入里边。而在DBA_SEGMENTS这个数据库视图里边,BLOCKS列是指这个表总共占用的BLOCK的数目,包括有数据和没有数据的BLOCK总量。如果把第一个视图里边的BLOCKS和EMPTY_BLOCKS地总和加起来,正好等于第二个视图的BLOCKS列的大小。 
8. 怎样把数据库的一张,多张表存为一个普通的文本文件? 
可以在SQL*Plus里边用SPOOL命令把选出来的数据保存在SPOOL指定的文件里边。 
9. 怎样从一张表里删除重复的记录 
SQL> SELECT * FROM EMP; 
EMP_ID office_ID EMPNAME 
305 12 ELLISON, GEORGE 
305 12 MERCURIO, JASON 
128 17 SIMPSON, LINDA 
305 22 JACKSON, DREW 
使用下面的SQL语句来识别那些重复的记录: 
SQL> SELECT COUNT(*), EMP_ID, office_ID 
FROM EMP 
GROUP BY EMP_ID, office_ID 
HAVING COUNT(*) > 1; 
结果如下: