|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
刚开始写页面程序,调试完书中的例子。然后就可以尝试编写留言板了,oracle|解答|成绩 之前汇集的一个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;
了局以下:
COUNT(*) EMP_ID OFFICE_ID
2 305 12
Table Example, with duplicate values:
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> DELETE FROM EMP A WHERE
(EMP_ID, OFFICE_ID, 2) IN
(SELECT EMP_ID, OFFICE_ID, decode(count(*),1,1,2)
FROM EMP B
WHERE A.EMP_ID=B.EMP_ID AND
A.OFFICE_ID = B.OFFICE_ID
GROUP BY EMP_ID, OFFICE_ID);
10. 如何在SQL*PLUS里想数据库拔出特别字符?
可使用CHR函数。
11. 如何删除一个列?
在Oracle8i里边,可以直接Drop一个列。语法为alter table table_name drop column_name;
然而注重要在initsid.ora里边设定compatible=8.1.0以上。
12. 如何重定名一个列?
1 alter table "table_name" add
(new_column_name data_type);
2 update table_name set new_column_name =
old_column_name where rowid=rowid;
3 alter table table_name drop column
old_column_name;
13. 如何疾速清空一张表?
Truncate table table_name;
14. 如何为事务指定一个大的回滚段?
Set transaction use rollback segment rbs_name;
15. 如何晓得一张表上有那些权限付与了哪些人,给他们了甚么权限?
select * from dba_tab_privs where table_name='表名';
16. 怎样发明是谁锁住了你需求的一张表?
Select object_id from v$locked_object;
Select object_name, object_type from dba_objects where object_id=’’;
每次清空一张表的时分,(利用truncate),这张表的存储参数NEXT主动复位到最初被删除的谁人extent的巨细。一样,假如显式地从一张内外边释放空间,NEXT参数也会主动被设置成最初被释放的谁人extent的巨细。
在SQL*Plus里边可觉得一个事务指定一个回滚段:这在有大的事务将要产生的话时分仍是很有效的。利用上面的语句可觉得这个事务指定一个回滚段:
SQL>SET TRANSACTION USE ROLLABCK SEGMENT 回滚段称号;
还可以在PL/SQL里边为一个事务指定一个回滚段(不利用静态sql语句)。这个需求利用Oracle供应的包:DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT(‘回滚段称号’);
在有些平台上的Oracle,在启动的时分会主动生成一个sgadefSID.dbf,用这个文件是不是存在就能够判别一个实例是不是在运转。这个文件包括了SGA在内存中的地址。在数据库封闭的时分,Oracle会主动删除这个文件。然而在Oracle8i里边,这个文件不再存在了。需求利用新的判别体例来判定事实某个实例是不是在运转。好比PS号令。
在Oracle7里边,想要晓得数据文件是不是可以主动扩大,必需从sys.filext$这张内外边查取,然而在Oracle8里边,从dba_data_files里边就能够晓得数据文件是不是可以主动扩大了。
从Oracle8i入手下手,可以创立另外一类数据库一级的触发器,好比数据库启动、封闭,用户登录、刊出等事务,都可以触发这个事务的产生,从而作某些纪录。在数据库一级界说的触发器会在一切用户响应事务产生的时分触发,而在Schema一级界说的触发器只要在某个特定用户的响应事务产生的时分才会触发。
从Oracle8i入手下手,多了一种封闭数据库的体例:SHUTDOWN TRANSACTIONAL。这类体例答应一切的用户提交它们的任务。然而一旦提交以后就即刻被割断联接,等一切用户都完成了各自的事务,shutdown就入手下手了。
从Oracle8入手下手,可以创立一时表,这些表的界说关于一切该用户的会话都是可以看到的,然而每一个会话查询、拔出、删除的数据和其余会话查询、拔出、删除的数据都是不相干的。就像每一个会话都分离有如许一份表一样。
从Oracle8i入手下手,关于那些没有停止分区的表,可以不必IMP/EXP就能够疾速重组。然而这需求两倍于该表容量的表空间。这个语句就是:
ALTER TABLE TB_NAME MOVE TABLESPACE TS_NAME;
在Oracle8i里边可以创立反序索引。(CREATE INDEX i ON t (a,b,c) REVERSE;)。因为反序索引的相邻键值不是寄存在物理相邻的地位,因而只要全索引扫描或经由过程单个列这一类语句才干够无效使用这些索引。这类反序索引在Oracle并行办事器上可以较好地调和分歧实例对数据库的修正,可以在必定水平上进步体系功能。
从Oracle8入手下手,$instance视图可以查获很多有效的信息:好比主机称号,实例名,启动工夫,版本号等。
一时表空间里边创立的一时段只要在shutdown地时分才会被释放。
然而在permanent表空间里边创立的一时段在一个事务停止以后就会被释放,有Smon历程来完成这个义务。
oracle FAQ(2) from chao_ping
关于OPTIMAL参数
optimal是用于限制回滚段巨细的一个存储参数。在履行一个长的事务以后,谁人事务所利用的回滚段会对照大,而设置了Optimal这个参数今后,一旦事务提交停止,回滚段主动压缩到Optimal所指定的巨细。
假如你的体系中有很多长工夫运转的事务的话,那末应当把回滚段的Optimal参数设置的对照大一点。如许有益于坚持回滚段表空间的一连性。不然不休的扩大、压缩会使表空间加倍破裂。
假如体系中次要的事务都是短工夫的,那末应当把回滚段设置的对照小一些,如许有益于让回滚段外面的信息可以存储在SGA里边,以利于进步体系功能。
回滚段的Optimal参数可以在创立回滚段的时分指定,也能够用
ALTER ROLLBACK SEGMENT SEGMENT_NAME OPTIMAL XX M;如许来从头设定。
Oracle8i 里边的
ALTER SESSION SET CURRENT_SCHEMA=
可以用来更改以后的用户形式。
Oracle公司已传播鼓吹,不再撑持server manager,这个东西自从Oracle 6.0入手下手,就一向是办理Oracle数据库的次要东西。如今,SQL*Plus替换了Server Manager的位置,因而,Server Manager中响应的功效也都集成到了SQL*Plus当中。
SQL*Plus新增添的次要号令是startup, shutdown, archive log,和recover。固然,尺度的SQL语法依然是撑持的了,好比一系列的CREATE, ALTER等语句。然而也对个中的一些有了一些改动,好比本来不撑持的ALTER DATABASE OPEN,ALTER DATABASE MOUNT,ALTER DATABASE BACKUP 等句子。
关于SET号令,也多了一些新的选项,用来包括一些如主动恢复等。SHOW号令也入手下手可以用来直接显示参数SHOW PARAMETER ,SHOW SGA等。而这些,本来都只是在Server Manager外面才有的功效。
Oracle8i仍然保存了众所周知的INTERNAL账户,然而要记住,这次要是为了向后兼容。INTERNAL账户的功效如今入手下手有SYSDBA,SYSOPER这两个脚色来撑持了。INTERNAL/SYS的口令可以用上面这个办法来停止修正:
O/S Prompt> orapwd password=<some password>
当数据库方才创立的时分,SYS的暗码默许为change_on_install,而SYSTEM的暗码是manager,而INTERNAL则基本就没有暗码。因而,创立完数据库以后,第一件要做的工作就是改动以上三个用户的口令。INTERNAL的口令可以用后面提到过的办法来改动,而SYSTEM,SYS则可以直接用ALTER USER username IDENTIFIED BY password;来更改。注重,在Oracle8i入手下手,ALTER USER SYS IDENTIFIED BY password;同时也会更改INTERNAL的暗码,假如你为INTERNAL设置了暗码的话,同时,即刻把SYSDBA,SYSOPER这两个脚色授与担任办理这个数据库的用户。关于那些利用INTERNAL来毗连数据库的剧本,也要响应的作一些修正。
启动和封闭数据库:
要从SQL*Plus里边启动数据库,请依照以下的步调停止:
O/S Prompt>sqlplus /nolog
SQL> connect scott/tiger as SYSDBA
SQL> startup
假如但愿用分歧于默许得参数来启动数据库,可使用上面代参数的启动号令:
SQL> startup PFILE=<init.ora file to be used>
有时分需求启动数据库,然而不让通俗用户进入,好比为了均衡IO,需求挪动一个数据文件的地位,这时候候就需求改动默许得启动选项:
SQL> startup mount
当完成了保护义务以后,可以选择封闭数据库然后再从头依照正常体例翻开,或直接在SQL*Plus里边输出上面的号令,Oracle就能够入手下手正常运转了:
SQL> alter database open
有时分需求创立一个新的数据库,或需求重建掌握文件,就需求用上面的语句:
SQL> startup nomount
有时分,数据库难以正常启动,就能够思索利用上面的举措来强制启动:利用FORCE选项,STARTUP FORCE实践上相当于一个SHUTDOWN ABORT然后再STARTUP如许一个进程。
SQL> startup force
SHUTDOWN这个号令也有好几种参数可以选择:
正常封闭是守候一切用户都从体系加入今后,再正常封闭体系。这是一种最最幻想的封闭数据库的体例。普通都应当利用这类体例来正常封闭数据库。
SQL> shutdown
在Oracle8i入手下手,新加了一个封闭选项:SHUTDOWN TRANSACTIONAL。这答应一切用户都完成它们的事务,一旦事务提交,即刻被断开毗连。如许既包管了用户不会丧失它们的事务,也包管了数据库可和时封闭,停止需要的保护操作。这类体例封闭的话,下次体系启动以后,也不必停止实例一级的恢复。比上面提到的别的两种体例都要幻想。
SQL> shutdown transactional
SHUTDOWN IMMEDIATE是即刻中断用户确当前事务,其实不等这些事务完成,回滚这些用户确当前事务。然而假如有一些事务好久没有提交的话,那末SHUTDOWN IMMEDIATE也许就不像说得那样IMMEDIATE了。能够也要花良多工夫往返滚这些事务。
SQL> shutdown immediate
在Oracle8i里边最初一种封闭体例是SHUTDOWN ABORT。这类封闭体例和直接封闭盘算机的电源其实没有太多的区分。任何以后毗连的用户都被即刻断开联接,鄙人次实例再次启动的时分,必需停止实例一级的恢复,用以回滚没有提交的事务。
SQL> shutdown abort
ALTER TABLE table_name MOVE以后,表上的索引标记为UNUSABLE?
在Oracle8i入手下手,可以直接利用alter table table_name move [tablespace tablespace_name];
来为一张表挪动到另外一个表空间,或从头组织表的存储体例,以削减碎片。然而,如许利用过以后,一切这张表上的索引都将被标记为unusable。这是由于MOVE一张表以后,表中列对应的物理地位都改动了,就是一切行的ROWID都变更了,而这张表的索引就用到了个中行的ROWID。因为Oracle不会主动更新索引对应的ROWID,这时候候,索引上的ROWID就指向了毛病的中央。因而,索引被标记为UNUSABLE。这时候候,你就需求手工重建索引。可使用上面的语法来重建索引:
ALTER INDEX index_name REBUILD;固然,还可觉得索引指定特定的适合的存储参数,来优化索引的存储。也许Oracle之所以没有主动保护索引,就是为了让你可觉得索引指定适合的存储参数。
若何近程装置Oracle:
假如需求从PC机上的X-window客户端装置Unix上的Oracle体系,要注重上面这一点:Oracle8i利用的是Universal Installer,利用了Java手艺,必需在图形界面下装置。假如是近程装置,必需设置一下甚么中央来显示Universal Installer的图形界面:利用
$DISPLAY=workstation_name:0.0
$export DISPLAY
举一个例子,你的PC机的IP地址是150.150.4.128,机械名字叫做test,那末就能够利用上面的语法来停止为装置作筹办任务:
$DSIPLAY=150.150.4.128:0.0
$export DISPLAY
或利用上面的语法,然而必需这个test机械的信息写在hosts文件里边:
DSIPLAY=test:0.0
$export DISPLAY
应该大致熟悉了一些学习过程,也许我的过程和你的有些出路,但是不管怎么样是殊途同归,我写这么多,也只是给大家一个借鉴的机会,至于好与不好,默默不敢打包票^0^ |
|