日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle常见语句(转载)

發布時間:2024/3/13 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle常见语句(转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

--==================================== 一.sql語句方面 ====================================================
--========================================================================================================
1.增加主鍵
?? alter table TABLE_NAME add constraint KEY_NAME primary key (TABLE_COLUMN);
?? 指定表空間
?? alter table TABLE_NAME add constraint KEY_NAME primary key (TABLE_COLUMN) using index? tablespace TABLE_SPACE_NAME;
2.增加外鍵
?? alter table TABLE_NAME add constraint FK_NAME? foreign key (TABLE_COLUMN) references KEY_TABLE_NAME;
3.使主鍵或外鍵失效、生效
?? alter table TABLE_NAME? disable(enable) constraint KEY_NAME;
4、查看各種約束
? select constraint_name,table_name,constraint_type,status from user_constraints;
? select constraint_name, constraint_type,search_condition, r_constraint_name? from user_constraints where table_name = upper('&table_name')

? select c.constraint_name,c.constraint_type,cc.column_name ?
?? ???? from user_constraints c,user_cons_columns cc
?? ???? where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')
?? ???? and c.owner = cc.owner and c.constraint_name = cc.constraint_name
?? ???? order by cc.position;

5、刪除主鍵或外鍵
? alter table TABLE_NAME? drop constraint KEY_NAME;
6、建外鍵
??? 單字段時:create table 表名 (col1? char(8),
???????????????????????????????? cno?? char(4)? REFERENCE course);
??? 多個字段時,在最后加上 Foreign Key (字段名) REFERENCE 表名(字段)
??? 連帶刪除選項 (on delete cascade
?????? 當指定時,如果父表中的記錄被刪除,則依賴于父表的記錄也被刪除
???????????? REFERENCE 表名() on delete cascade;
7、刪除帶約束的表
??? Drop table 表名 cascade? constraints;

8:索引管理
<1>.creating function-based indexes
sql> create index summit.item_quantity on summit.item(quantity-quantity_shipped);

<2>.create a B-tree index
sql> create [unique] index index_name on table_name(column,.. asc/desc) tablespace
sql> tablespace_name [pctfree integer] [initrans integer] [maxtrans integer]
sql> [logging | nologging] [nosort] storage(initial 200k next 200k pctincrease 0
sql> maxextents 50);

<3>.pctfree(index)=(maximum number of rows-initial number of rows)*100/maximum number of rows

<4>.creating reverse key indexes
sql> create unique index xay_id on xay(a) reverse pctfree 30 storage(initial 200k
sql> next 200k pctincrease 0 maxextents 50) tablespace indx;

<5>.create bitmap index
sql> create bitmap index xay_id on xay(a) pctfree 30 storage( initial 200k next 200k
sql> pctincrease 0 maxextents 50) tablespace indx;

<6>.change storage parameter of index
sql> alter index xay_id storage (next 400k maxextents 100);

7.allocating index space
sql> alter index xay_id allocate extent(size 200k datafile 'c:/oracle/index.dbf');

<8>.alter index xay_id deallocate unused;

<9>、查看索引
?? ??? ?SQL>select index_name,index_type,table_name from user_indexes order by table_name;
<10>、查看索引被索引的字段
?? ??? ?SQL>select * from user_ind_columns where index_name=upper('&index_name');

11、創建序列
??? select * from user_sequences;
??? create? sequence SEQ_NAME? start with 1000
???????? maxvalue? 1000 increment by 1;
??? alter sequence? SEQ_NAME minvalue 50 maxvalue 100;
12、刪除重復行
??? update a set aa=null where aa is not null;
?? ?
??? delete from a where rowid!=
??????? (select max(rowid) from a? b where? a.aa=b.aa);
13、刪除同其他表相同的行
??? delete from a? where exits
????? (select 'X' from b where b.no=a.no);
??? 或
????? delete from a? where no in (select no from b);
14、查詢從多少行到多少行的記錄(可以用在web開發中的分頁顯示)

?select * from ( select rownum row_id,b.* from (select a.* from sys_oper a) b )
?where row_id between 15 and 20

15、對公共授予訪問權
??? grant select on 表名 to public;
??? create public synonym 同義詞名? for 表名;
16、填加注釋
??? comment on table 表名 is? '注釋';
??? comment on column 表名.列名 is '注釋';
17、分布式數據庫,創建數據庫鏈路
??? create [public] database link LINKNAME
?????? [connect to USERNAME identified by PASSWORD]
?????? [using 'CONNECT_STRING']
??? 可以在服務器端,也可以在客戶端建立,但必須注意,兩臺服務器之間
??? 數據庫必須可以互訪,必須各有各自的別名數據庫
18、查看數據庫鏈路
??? select * from? all_db_links;
??? select * from user_db_links;
??? 查詢? select * from TABLENAME@DBLNKNAME;
??? 創建遠程數據庫同義詞
?????? create synonym? for TABLENAME@DBLNKNAME;
??? 操縱遠程數據庫記錄
????? insert into TABLENAME@DBLNKNAME (a,b)? values (va,vb);
????? update??? TABLENAME@DBLNKNAME? set a='this';
????? delete from TABLENAME@DBLNKNAME;
?? 怎樣執行遠程的內嵌過程
?????? begin
???????? otherdbpro@to_html(參數);
?????? end;

19、數據庫鏈路用戶密碼有特殊字符的時候,可以用雙引號把密碼引起來
create public database link dblink1 connect to db1 identified by "123*456" using 'db11'

20.oracle8中擴充了group by rollup和cube的操作。有時候省了你好多功夫的。
??? <1>下面的語句可以進行總計
??? select region_code,count(*) from aicbs.acc_woff_notify
??? group by rollup(region_code);
??? <2> 對第1個字段小計,最后合計
??? select region_code,write_status,count(*) from aicbs.acc_woff_notify
??? group by rollup(region_code,write_status);
??? ----------------------
??? ??? 570???? 0?????? 3
??? ??? 570???? 1?????? 2
??? ??? 570???????????? 5?? --此處小計了570的記錄
??? ??? 571???? 0?????? 10
??? ??? 571???? 1?????? 2
??? ??? 571???????????? 12? --此處小計了571的記錄
??? ??? .....
??? ??? ??? ??? ??? ??? 100 --此處有總計
??? <3> 復合rollup表達式,只做總計
??? select region_code,write_status,count(*) from aicbs.acc_woff_notify
??? group by rollup(region_code,write_status);
??? ??? ???
??? <4> 對第1個字段小計,再對第2個字段小計,最后合計
??? select region_code,write_status,count(*) from aicbs.acc_woff_notify
??? group by cube(region_code,write_status);
??? ----------------------
??? ??? ??? ??? ??? ??? 100 ??? --此處有總計
??? ??? ??? ??? 0??? ??? 60??? ??? --對write_status=0的小計
??? ??? ??? ??? 1??? ??? 39??? ??? --對write_status=1的小計
??? ??? ??? ??? 3??? ??? 1??? ??? --對write_status=3的小計
??? ??? 570??? ??? ??? ??? 5??? ??? --此處小計了570的記錄
??? ??? 570??? ??? 0??? ??? 3
??? ??? 570??? ??? 1??? ??? 2
??? ??? 571??? ??? ??? ??? 12??? ??? --此處小計了571的記錄
??? ??? 571??? ??? 0??? ??? 10
??? ??? 571??? ??? 1??? ??? 2
??? ??? ....
??? <3> 復合cube表達式,只做總計
??? select region_code,write_status,count(*) from aicbs.acc_woff_notify
??? group by cube(region_code,write_status);
??? ??? ???
???
??? <4>下面的語句可以按照rollup不同的字段進行小計
??? select region_code,write_status,count(*) from aicbs.acc_woff_notify
??? group by region_code,rollup(write_status);
21.查詢view的創建語句
? sql>set long 1000
? sql>select * from user_views where view_name='MY_VIEW_NAME';
?? or
?sql>select * from all_views where view_name='MY_VIEW_NAME';

22、去除數據庫中特殊字符
??? <1>.字符串字段中含有"'",如果用來組合sql語句,會造成語句不準確。
??? ??? 比如:replace(f1,'''','')
??? <2>.字符串字段中含有"/t /n",如果用來在c或者c++程序中輸出到文件,格式無法保證。
??? ??? 比如:replace(f2,'/t','')
??? <3>.清除換行和回車
??? ??? 比如: replace(f2,chr(13)||chr(10),'')
23、如何在字符串里加回車或者tab鍵
? 在sqlplus中執行
?? sql>select 'UserId=1233111'||chr(10)||'AccId=13431'||chr(9)||'AccId2=11111' from dual;

24、樹形查詢
create table zj(
bm???? number(8),
bmmc?? varchar2(20),
sjbm?? number(8)
)

insert into zj values(1,'aaa',0)
insert into zj values(11,'aaa1',1)
insert into zj values(12,'aaa2',1)
insert into zj values(111,'aaa11',11)
insert into zj values(112,'aaa12',11)
insert into zj values(113,'aaa13',11)
insert into zj values(121,'aaa21',12)
insert into zj values(122,'aaa22',12)
insert into zj values(123,'aaa23',12)
--
select bm,bmmc,sjbm,level
from zj
start with sjbm=0
connect by prior? bm = sjbm
或者

select bm,bmmc,sjbm,level
from zj
start with sjbm=0
connect by? sjbm = prior? bm


25、快照
??? create snapshot SNAPSHOT_NAME
?????? [storage (storage parameter)]
?????? [tablespace? TABLESPACE_NAME]
?????? [refresh? [fast/complete/force]
?????? [start with? START_DATE next NEXT_DATE]
?????? as QUERY;
??
?? create snapshot snapshot_to_study as select * from TABLE_NAME@to_study;
?? 創建角色
???? create role aa identified by aaa;
?? 授權? grant create snapshot,alter snapshot to aaa;
???????? grant? aaa to emp;
?? create snapshot SNAPSHOT_TO_HTML refresh? complete start with sysdate next
?????? sysdate+5/(24*60*60) as? select * from a@to_html;
?? 刪除? drop snapshot snap_to_html
?? 手工刷新快照,(調用DBMS_SNAPSHOT包中的refresh過程)DBMS_SNAPSHOT.refresh(snapshot_name,refresh_type);
?????? begin
????????? DBMS_SNAPSHOT.REFRESH('snap_to_html','c');
?????? end;
?? 對所有快照進行刷新
?????? begin
????????? DBMS_SNAPSHOT.REFRESH_ALL;
?????? end;
?? 怎樣執行遠程的內嵌過程
?????? begin
???????? otherdbpro@to_html(參數);
?????? end;
26、用戶管理
??? create a user: database authentication
??? ??? sql> create user juncky identified by oracle default tablespace users
??? ??? sql> temporary tablespace temp quota 10m on data password expire
??? ??? sql> [account lock|unlock] [profile profilename|default];

??? <1>.查看當前用戶的缺省表空間
??? SQL>select username,default_tablespace from user_users;
??? <2>生成用戶時指定缺省表空間
??? ??? create user 用戶名 identified by 口令? default????? tablespace 表空間名;
??? ???
??? <3>重新指定用戶的缺省表空間
??? ??? ??? alter user 用戶名 default tablespace 表空間名
??? <4>查看當前用戶的角色
??? SQL>select * from user_role_privs;
??? <5>查看當前用戶的系統權限和表級權限
??? ??? SQL>select * from user_sys_privs;
??? ??? SQL>select * from user_tab_privs;
??? <6>查看用戶下所有的表
??? ??? ??? SQL>select * from user_tables;
??? <7> alter user語句的quota子句限制用戶的磁盤空間
?? ??? ??? 如:alter user jf? quota 10M? on system;


27、查看放在ORACLE的內存區里的表??? ???
??? ??? SQL>select table_name,cache from user_tables where instr(cache,'Y')>0;

28、約束條件
??? create table employee
???? (empno? number(10)? primary key,
????? name?? varchar2(40) not null,
????? deptno? number(2)? default 10,
????? salary? number(7,2)? check? salary<10000,
????? birth_date date,
????? soc_see_num? char(9)? unique,
????? foreign key(deptno) references dept.deptno)
????? tablespace users;
?????
??? 關鍵字(primary key)必須是非空,表中記錄的唯一性
??? not null? 非空約束
??? default?? 缺省值約束
??? check???? 檢查約束,使列的值符合一定的標準范圍
??? unqiue? 唯一性約束
??? foreign key 外部鍵約束

29、查看創建視圖的select語句
??? ??? SQL>set view_name,text_length from user_views;
??? ??? SQL>set long 2000;??? ??? 說明:可以根據視圖的text_length值設定set long 的大小
??? ??? SQL>select text from user_views where view_name=upper('&view_name');

30、查看同義詞的名稱
??? ??? SQL>select * from user_synonyms;

31、用Sql語句實現查找一列中第N大值
select * from
(select t.*,dense_rank() over (order by sal) rank from employee)
where rank = N;

32 虛擬自段
? <1>. CURRVAL 和 nextval
?? 為表創建序列
?? CREATE SEQUENCE EMPSEQ ... ;
?? SELECT empseq.currval FROM DUAL ;
?? 自動插入序列的數值
?? INSERT INTO emp
??????? VALUES (empseq.nextval, 'LEWIS', 'CLERK',
??????????????? 7902, SYSDATE, 1200, NULL, 20) ;

?? <2>. ROWNUM
?? ??? 按設定排序的行的序號
?? ??? SELECT * FROM emp WHERE ROWNUM < 10 ;

?? <3>. ROWID
?? ??? 返回行的物理地址
?? ??? SELECT ROWID, ename FROM emp? WHERE deptno = 20 ;

33、對CLOB字段進行全文檢索
SELECT * FROM A WHERE dbms_lob.instr(a.a,'K',1,1)>0;

34. 特殊字符的插入,比如"&"
insert into a values (translate ('at{&}t','at{}','at'));



35.表管理
?<1>.create a table
??? sql> create table table_name (column datatype,column datatype]....)
??? sql> tablespace tablespace_name [pctfree integer] [pctused integer]
??? sql> [initrans integer] [maxtrans integer]
??? sql> storage(initial 200k next 200k pctincrease 0 maxextents 50)
??? sql> [logging|nologging] [cache|nocache]

?<2>.copy an existing table
??? sql> create table table_name [logging|nologging] as subquery
?
?<3> create table ... as 方式建表的時候,指定表參數
??? create table a
????? storage(
????????????? initial 1M?? /*第一次創建時分配空間*/
????????????? next 1M????? /*第一次分配的存儲空間用完時在分配*/
????????????? )
????????????? as? select * from b;
?<4>.創建臨時表
??? sql> create global temporary table xay_temp as select * from xay;
??? ??? on commit preserve rows/on commit delete rows
??? 在Oracle中,可以創建以下兩種臨時表:
?? a 會話特有的臨時表:
??? create global temporary table () on commit preserve rows;
??? 會話指定,當中斷會話時ORACLE將截斷表

?? b 事務特有的臨時表:
??? create global temporary table () on commit delete rows;
??? 事務指定,每次提交后ORACLE將截斷表(刪除全部行)
?? c 說明
??? 臨時表只在當前連接內有效
  臨時表不建立索引,所以如果數據量比較大或進行多次查詢時,不推薦使用
  數據處理比較復雜的時候時表快,反之視圖快點
  在僅僅查詢數據的時候建議用游標: open cursor for 'sql clause';
?<5>
??? pctfree = (average row size - initial row size) *100 /average row size
??? pctused = 100-pctfree- (average row size*100/available data space)
?<6>.change storage and block utilization parameter
??? sql> alter table table_name pctfree=30 pctused=50 storage(next 500k
??? sql> minextents 2 maxextents 100);
?<7>.manually allocating extents
??? sql> alter table table_name allocate extent(size 500k datafile 'c:/oracle/data.dbf');
?<8>.move tablespace
??? sql> alter table employee move tablespace users;
?<9>.deallocate of unused space
??? sql> alter table table_name deallocate unused [keep integer]
?<10>.drop a column
??? sql> alter table table_name drop column comments cascade constraints checkpoint 1000;
??? alter table table_name drop columns continue;
?<11>.mark a column as unused
??? sql> alter table table_name set unused column comments cascade constraints;
??? ??? alter table table_name drop unused columns checkpoint 1000;
??? ??? alter table orders drop columns continue checkpoint 1000
??? ??? data_dictionary : dba_unused_col_tabs





37. 中文是如何排序的?

Oracle9i之前,中文是按照二進制編碼進行排序的。
在oracle9i中新增了按照拼音、部首、筆畫排序功能。設置NLS_SORT值
SCHINESE_RADICAL_M 按照部首(第一順序)、筆劃(第二順序)排序
SCHINESE_STROKE_M 按照筆劃(第一順序)、部首(第二順序)排序
SCHINESE_PINYIN_M 按照拼音排序

38. 數據表中的字段最大數:
表或視圖中的最大列數為 1000


39. oracle中的裸設備:
? 裸設備就是繞過文件系統直接訪問的儲存空間

40. 在Oracle服務器上通過SQLPLUS查看本機IP地址 ?
select sys_context('userenv','ip_address') from dual;
如果是登陸本機數據庫,只能返回127.0.0.1

41. 在ORACLE中取毫秒?
?? 9i之前不支持,9i開始有timestamp.
?? 9i可以用select systimestamp from dual;

42. 將N秒轉換為時分秒格式?
?? set serverout on
?? declare
?? N number := 1000000;
?? ret varchar2(100);
?? begin
?? ret := trunc(n/3600) || '小時' || to_char(to_date(mod(n,3600),'sssss'),'fmmi"分?? "ss"秒"') ;
?? dbms_output.put_line(ret);
?? end;

43、在某個用戶下找所有的索引
?? select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name
?? from user_ind_columns, user_indexes
?? where user_ind_columns.index_name = user_indexes.index_name
?? and user_ind_columns.table_name = user_indexes.table_name
?? order by user_indexes.table_type, user_indexes.table_name,
?? user_indexes.index_name, column_position;


44. not in的替代。
?? 一般not in的效率比較低。特別是數據量大的時候,幾乎不能執行。
?? 用下面幾種方式可以替換寫法
?? 比如要查詢在fee_rev_info表中已經銷戶的用戶(不在cm_user中的)(不過下面的例子不是很好,因為bill_id是cm_user的唯一索引)
?? select * from fee_rev_info where bill_id not in (select bill_id from cm_user)??
?? <1> 用not exists
?? select * from fee_rev_info a where not exists (select 'p' from cm_user b where b.bill_id = a.bill_id)
?? <2> 用外連接(+)
??? select a.* from fee_rev_info a,cm_user b
??? where a.bill_id = b.bill_id (+)
??? and b.bill_id is null
?? <3> 用hash_aj
?? select /*+HASH_AJ*/* from fee_rev_info where bill_id not in (select bill_id from cm_user)??

45.怎么樣查詢特殊字符,如通配符%與_
假如數據庫中有表 STATIONTYPE,STATION_571 STATION_572 ...
select * from tab? where tname like 'STATION_%'
會顯示 STATIONTYPE,STATION_571 ... 可以用下面的語句
select * from tab? where tname like 'STATION/_%' escape'/'

46.如果存在就更新,不存在就插入可以用一個語句實現嗎
9i已經支持了,是Merge,但是只支持select子查詢,
如果是單條數據記錄,可以寫作select .... from dual的子查詢。
語法為:
MERGE INTO table
USING data_source
ON (condition)
WHEN MATCHED THEN update_clause
WHEN NOT MATCHED THEN insert_clause;


MERGE INTO cm_user_credit?
USING (select * from dual) ON (user_id =1302514690 )
when MATCHED then update set credit_value = 1000
when NOT MATCHED then insert (user_id,acc_id,bill_id,plan_id,region_code,credit_value) values(1302514690,1305032158,'13857141218',10070247,'571',1000);

47.怎么實現一條記錄根據條件多表插入
9i以上可以通過Insert all語句完成,僅僅是一個語句,如:
INSERT ALL
WHEN (id=1) THEN
INTO table_1 (id, name)
values(id,name)
WHEN (id=2) THEN
INTO table_2 (id, name)
values(id,name)
ELSE
INTO table_other (id, name)
values(id, name)
SELECT id,name
FROM a;

如果沒有條件的話,則完成每個表的插入,如
INSERT ALL
INTO table_1 (id, name)
values(id,name)
INTO table_2 (id, name)
values(id,name)
INTO table_other (id, name)
values(id, name)
SELECT id,name
FROM a;

48.如何實現行列轉換
<1>、固定列數的行列轉換

student subject grade
---------------------------
student1 語文 80
student1 數學 70
student1 英語 60
student2 語文 90
student2 數學 80
student2 英語 100
...
轉換為
語文 數學 英語
student1 80 70 60
student2 90 80 100
...
語句如下:
select student,sum(decode(subject,'語文', grade,null)) "語文",
sum(decode(subject,'數學', grade,null)) "數學",
sum(decode(subject,'英語', grade,null)) "英語"
from table
group by student

<2>、不定列行列轉換

c1 c2
--------------
1 我
1 是
1 誰
2 知
2 道
3 不
...
轉換為
1 我是誰
2 知道
3 不

這一類型的轉換必須借助于PL/SQL來完成,這里給一個例子
CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER)
RETURN VARCHAR2
IS
Col_c2 VARCHAR2(4000);
BEGIN
FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
Col_c2 := Col_c2||cur.c2;
END LOOP;
Col_c2 := rtrim(Col_c2,1);
RETURN Col_c2;
END;
/
SQL> select distinct c1 ,get_c2(c1) cc2 from table;即可


--例子:
create table okcai_1
(
user_id varchar2(10),
user_number varchar2(10),
user_num number(8)
)
user_id user_number user_num
---------------------
1??? 123 ??? 2
1??? 456 ??? 5
1??? 789 ??? 6
2??? 11? ??? 2
2??? 22? ??? 3
2??? 33? ??? 4
2??? 44? ??? 5
2??? 55? ??? 6
2??? 66? ??? 7
2??? 77? ??? 8
3??? 1234??? 1
3??? 5678??? 2

方式一:
create or replace function get_col(
?????? p_userId number,
?????? p_col??? number
) return varchar
as
v_tmp varchar2(255);
begin
???? select user_number||chr(9)||user_num into v_tmp
???? from
???? (select user_number,user_num,rownum row_id
????? from okcai_1
????? where user_id = p_userId) a
???? where row_id = p_col;
???? return ltrim(v_tmp);
???? --return v_tmp;
end;

然后
select distinct user_id,get_col(user_id,1),get_col(user_id,2),get_col(user_id,3) .... from okcai_1

方式二:
create or replace function get_col(
?????? p_userId number,
?????? p_col??? number
) return varchar
as
v_tmp varchar2(255);
begin
???? select user_number||chr(9)||user_num into v_tmp
???? from
???? (select user_number,user_num,rownum row_id
????? from okcai_1
????? where user_id = p_userId) a
???? where row_id = p_col;
???? return ltrim(v_tmp);
???? --return v_tmp;
end;
select distinct user_id,get_col_new(user_id) from okcai_1;


49.怎么設置存儲過程的調用者權限
普通存儲過程都是所有者權限,如果想設置調用者權限,請參考如下語句
create or replace
procedure ...()
AUTHID CURRENT_USER
As
begin
...
end;



50.Oracle有哪些常見關鍵字
詳細信息可以查看v$reserved_words視圖

51.怎么查看數據庫參數
<1> show parameter 參數名
如通過show parameter spfile可以查看9i是否使用spfile文件
其中參數名是可以匹配的。
比如show parameter cursor ,則會顯示跟cursor相關的參數
<2>
select * from v$parameter
<3>

除了這部分參數,Oracle還有大量隱含參數,可以通過如下語句查看:
SELECT NAME
,VALUE
,decode(isdefault, 'TRUE','Y','N') as "Default"
,decode(ISEM,'TRUE','Y','N') as SesMod
,decode(ISYM,'IMMEDIATE', 'I',
'DEFERRED', 'D',
'FALSE', 'N') as SysMod
,decode(IMOD,'MODIFIED','U',
'SYS_MODIFIED','S','N') as Modified
,decode(IADJ,'TRUE','Y','N') as Adjusted
,description
FROM ( --GV$SYSTEM_PARAMETER
SELECT x.inst_id as instance
,x.indx+1
,ksppinm as NAME
,ksppity
,ksppstvl as VALUE
,ksppstdf as isdefault
,decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE') as ISEM
,decode(bitand(ksppiflg/65536,3),
1,'IMMEDIATE',2,'DEFERRED','FALSE') as ISYM
,decode(bitand(ksppstvf,7),1,'MODIFIED','FALSE') as IMOD
,decode(bitand(ksppstvf,2),2,'TRUE','FALSE') as IADJ
,ksppdesc as DESCRIPTION
FROM x$ksppi x
,x$ksppsv y
WHERE x.indx = y.indx
AND substr(ksppinm,1,1) = '_'
AND x.inst_id = USERENV('Instance')
)
ORDER BY NAME


52.怎樣建立基于函數索引
8i以上版本,確保
Query_rewrite_enabled=true
Query_rewrite_integrity=trusted
Compatible=8.1.0以上
Create index indexname on table (function(field));

53.怎么樣移動表或表分區
[A]移動表的語法
Alter table tablename move
[Tablespace new_name
Storage(initial 50M next 50M
pctincrease 0 pctfree 10 pctused 50 initrans 2) nologging]
移動分區的語法
alter table tablename move (partition partname)
[update global indexes]
之后之后必須重建索引
Alter index indexname rebuild
如果表有Lob段,那么正常的Alter不能移動Lob段到別的表空間,而僅僅是移動了表段,可以采用如下的方法移動Lob段
alter table tablename move
lob(lobsegname) store as (tablespace newts);

54.怎么樣修改表的列名
[A]9i以上版本可以采用rname命令
ALTER TABLE UserName.TabName
RENAME COLUMN SourceColumn TO DestColumn
9i以下版本可以采用create table …… as select * from SourceTable的方式。
另外,8i以上可以支持刪除列了
ALTER TABLE UserName.TabName
SET UNUSED (ColumnName) CASCADE CONSTRAINTS
ALTER TABLE UserName.TabName
DROP (ColumnName) CASCADE CONSTRAINTS


55.case的用法
在sql語句中
CASE test_value
WHEN expression1 THEN value1
[[WHEN expression2 THEN value2] [...]]
[ELSE default_value]
END

比如1
SELECT last_name, job_id, salary
????? CASE job_id
?????????? WHEN 'IT_PROG' THEN 1.10*salary
?????????? WHEN 'ST_CLERK' THEN 1.15*salary
?????????? WHEN 'SA_REP' THEN 1.20*salary
???? ELSE salary END "REVISED_SALARY"
FROM employees?

比如2
select
??? case
??????? when? real_charge>=20000 and real_charge<30000 then 5000
??????? when? real_charge>=30000 and real_charge<40000 then 9000
??????? when? real_charge>=40000 and real_charge<50000 then 10000
??????? when? real_charge>=50000 and real_charge<60000 then 14000
??????? when? real_charge>=60000 and real_charge<70000 then 18000
??????? when? real_charge>=70000 and real_charge<80000 then 19000
??????? when? real_charge>=80000 and real_charge<90000 then 24000
??????? when? real_charge>=90000 and real_charge<100000 then 27000???????????????????????????????????????????????????????
??????? when? real_charge>=100000 and real_charge<110000 then 27000
??????? when? real_charge>=110000 and real_charge<120000 then 29000??????????????
??????? when? real_charge>=120000????????????????????? then 36000
??????? else
??????????? 0?
??? end ,acc_id,user_id,real_charge from okcai_jh_charge_200505

在存儲過程中
?????????????? case v_strGroupClassCode
??????????????????? when? '1'?? then
????????????????????????? v_nAttrNum := v_nAttrNum + 300;
????????????????????????? v_strAttrFlag := '1'||substr(v_strAttrFlag,2,7);
??????????????????? when? '2'?????????? then
????????????????????????? v_nAttrNum := v_nAttrNum + 200;
????????????????????????? v_strAttrFlag := '2'||substr(v_strAttrFlag,2,7);
??????????????????? else
??????????????????????? NULL;
?????????????? end case;
注意的是存儲過程和sql語句有的細微差別是用end case,而不是end。語句后面跟";"
--========================================================================================================
--======================================= 二.pl/sql 編程方面 =============================================
--========================================================================================================

1.自治事務:8i以上版本,不影響主事務。
在存儲過程的is/as
后面聲明PRAGMA AUTONOMOUS_TRANSACTION;
自治事務防止嵌套提交,使事務在自己的事務區內提交或回滾不會影響其他的事務。

2、包
?? 包說明(package specification),包頭,存放關于包的內容的信息,定義包的用戶可見的過程、
?? 函數,數據類型和變量
???? create or replace package? tt_aa? as
??????? v1? varchar2(10);
??????? v2? varchar2(10);
??????? v3? number;
??????? v4? boolean;
??????? procedure proc1(x? number);
??????? procedure proc2(y varchar2);
??????? procedure proc3(z? number);
??????? function my_add(x number,y number) return number;
????? end;
?? 包主體(package body)是可選的
???? create or replace package? body? tt_aa as
?????? procedure proc1(x number) as
???????? begin
?????????? v1:=to_char(x);
???????? end;
?????? procedure proc2(y varchar2) as
???????? begin
?????????? v2:=y;
???????? end;
?????? procedure proc3(z number) as
???????? begin
?????????? v1:=z;
???????? end;
?????? procedure proc4(x number,y number) return number as
???????? begin
?????????? return x+y;
???????? end;
???? end;
????
?? 調用
???? begin?
???????? tt_aa.proc1(6);
???????? dbms_output.put_line(to_char(tt_aa.my_add(1,3));
???? end;

3、動態sql(使用dbms_sql)
??? create or replace procedure my_execute(sql_string in varchar2) as
????? v_cursor? number;
????? v_numrows? interger;
??? begin
?????? v_cursor:=dbms_sql.open_cursor;
?????? dbms_sql.parse(v_cursor,sql_string,dbms_sql.v7);
?????? v_numrows:=dbms_sql.execute(v_cursor);
?????? dbms_sql.close_cursor(v_cursor);
??? end;
????
??? 則可以
???? sql>exec? my_execute('select * from tab');
???? sql>exec? my_execute('insert into test value'||'('||'''ddd'''||')');
???? sql>exec? my_execute('commit');
????
? 對于查詢方面的可以如下方式:
? 比如想用游標查詢一個表,但是這個表是分月的,每個月可能表名都會改變。
? create or replace procedure proc_test as
??? v_curid? integer;
??? v_result integer;
??? v_strSql varchar2(255);
??? v_userid okcai.userid%type;
??? v_username okcai.username%type;
? begin
???? v_strSql := 'select * from okcai_'||to_char(sysdate,'yyyymm');
???? v_curid := dbms_sql.open_cursor;
???? dbms_sql.parse(v_curid,v_strSql,dbms_sql.v7);
???? dbms_sql.define_column(v_curid,1,v_userid);
???? dbms_sql.define_column(v_curid,2,v_username,10);? --必須指定大小
???? v_result := dbms_sql.execute(v_curid);
???? loop
??????? if dbms_sql.fetch_rows(v_curid) = 0 then
??????????? exit; --沒有了 ,退出循環
??????? end if;
??????? dbms_sql.column_value(v_curid,1,v_userid);
??????? dbms_sql.column_value(v_curid,2,v_username);
??????? dbms_output.put_line(v_userid);
??????? dbms_output.put_line(v_username);
???? end loop;
???? dbms_sql.close(v_curid);
? end;

4、用EXECUTE IMMEDIATE
??? <1>. 在PL/SQL運行DDL語句
??? begin
????? execute immediate 'set role all';
??? end;
??? <2>. 給動態語句傳值(USING 子句)
??? declare
?????? l_depnam varchar2(20) := 'testing';
?????? l_loc??? varchar2(10) := 'Dubai';
??? begin
????? execute immediate 'insert into dept values? (:1, :2, :3)'
????????????? using 50, l_depnam, l_loc;
????? commit;
??? end;
?? <3>. 從動態語句檢索值(INTO子句)
?? declare
????? l_cnt??? varchar2(20);
?? begin
????? execute immediate 'select count(1) from emp'
????????? into l_cnt;
????? dbms_output.put_line(l_cnt);
? end;
?? <4>. 動態調用例程.例程中用到的綁定變量參數必須指定參數類型.黓認為IN類型,其它類型必須顯式指定
??? declare
? ??? ??? l_routin?? varchar2(100) := 'gen2161.get_rowcnt';
??? ??? l_tblnam?? varchar2(20) := 'emp';
? ??? ??? l_cnt????? number;
? ??? ??? l_status?? varchar2(200);
??? begin
? ??? ??? execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'
??? ??? ??? ??? using in l_tblnam, out l_cnt, in out l_status;

? ??? ??? if l_status != 'OK' then
???? ??? ??? ??? dbms_output.put_line('error');
? ??? ??? end if;
??? end;
?? <5>. 將返回值傳遞到PL/SQL記錄類型;同樣也可用%rowtype變量
???? declare
? ??? ??? type empdtlrec is record (empno? number(4),
?????????????????????????? ename? varchar2(20),
?????????????????????????? deptno? number(2));
? ??? ??? empdtl empdtlrec;
???? begin
? ??? ??? execute immediate 'select empno, ename, deptno ' ||
?????????????????? 'from emp where empno = 7934'
??? ??? ??? into empdtl;
???? end;
?? <6>. 傳遞并檢索值.INTO子句用在USING子句前
??? ?declare
? ??? ??? l_dept??? pls_integer := 20;
? ??? ??? l_nam???? varchar2(20);
? ??? ??? l_loc???? varchar2(20);
??? ?begin
??? ??? execute immediate 'select dname, loc from dept where deptno = :1'
??? ??? ??? ??? into l_nam, l_loc
??? ??? ??? ??? using l_dept ;
???? end;
?? <7>. 多行查詢選項.對此選項用insert語句填充臨時表,用臨時表進行進一步的處理,也可以用REF cursors糾正此缺憾.
???? declare
? ??? ??? l_sal?? pls_integer := 2000;
???? begin
? ??? ??? execute immediate 'insert into temp(empno, ename) ' ||
?????????????????? '????????? select empno, ename from emp ' ||
?????????????????? '????????? where? sal > :1'
??? ??? ??? using l_sal;
? ??? ??? commit;
???? end;
?? <8>. 完成update的returning功能
?????? update可以用returning返回修改以后的值。比如:
??? ??? UPDATE employees
??? ??? ??? SET job_id =’SA_MAN’, salary = salary + 1000, department_id = 140
??? ??? ??? WHERE last_name = ’Jones’
??? ??? ??? ??? RETURNING salary*0.25, last_name, department_id
??? ??? ??? ??? ??? INTO :bnd1, :bnd2, :bnd3;
?????? 用execute immediate來完成的時候,可以用
???? declare
? ??? ??? l_sal?? pls_integer;
???? begin
? ??? ??? execute immediate 'update employees SET salary = salary + 1000 where last_name=''okcai'' RETURNING INTO :1'
??? ??? ??? returning into v_sql;
? ??? ??? commit;
???? end;
???
?????
5、用ref cursor來完成動態游標的功能
declare
??? type ct is ref cursor;
??? cc ct;
??? v_notify acc_woff_notify%rowtype;
begin
??? open cc for 'select * from acc_woff_notify';
??? loop
??? ??? fetch cc into v_notify;
??? ??? exit when cc%notfound;
??? ??? dbms_output.put_line(v_notify.done_code);
??? end loop;
??? close cc;
end;?
??????
6、重新編譯
??? 對失效的過程
??? sql>exec? dbms_utility.compile_schema(schema);
??? 如:
??? sql>exec? dbms_utility.compile_schema(scott);

7.存儲過程使用table類型
<1>.字符串數組
declare
??? type regionType is table of varchar2(3) index by binary_integer;
??? v_listRegion regionType;
??? i??? number(2):=0;
begin
??? v_listRegion(1):='571';
??? v_listRegion(2):='572';
??? v_listRegion(3):='573';
??? v_listRegion(4):='574';
??? v_listRegion(5):='575';
??? v_listRegion(6):='576';
??? v_listRegion(7):=null;
??? i := 1;
??? while i<= v_listRegion.last loop
??? ??? dbms_output.put_line( v_listRegion(i) );
??? ??? i := v_listRegion.next(i);
??? end loop;
end;

<2>.rowtype數組
declare
??? type CmUserType is table of cm_user%rowtype index by binary_integer;
??? v_listUser CmUserType;
??? i??? number(5):=0;
??? r_user cm_user%rowtype;
begin
???
??? i := 1;
??? for r_user in (select * from cm_user where rownum<=5) loop
??? ??? v_listUser(i):= r_user;
??? ??? i := i + 1;
??? end loop;
???
??? i := 1;
??? while i<= v_listUser.last loop
??? ??? dbms_output.put_line( v_listUser(i).bill_id );
??? ??? i := v_listUser.next(i);
??? end loop;
end;

<3>. record數組
declare
??? type recCmUserType is record ??? (bill_id cm_user.bill_id%type,cust_name varchar2(25));
??? type CmUserType is table of recCmUserType index by binary_integer;
??? v_listUser CmUserType;
??? i??? number(5):=0;
??? r_user cm_user%rowtype;
begin
???
??? i := 1;
??? for r_user in (select * from cm_user where rownum<=5) loop
??? ??? v_listUser(i).bill_id:= r_user.bill_id;
??? ??? v_listUser(i).cust_name:= '客戶'||i;
??? ??? i := i + 1;
??? end loop;
???
??? i := 1;
??? while i<= v_listUser.last loop
??? ??? dbms_output.put_line( v_listUser(i).bill_id );
??? ??? dbms_output.put_line( v_listUser(i).cust_name );
??? ??? i := v_listUser.next(i);
??? end loop;
end;

8、存儲函數和過程
???
??? ??? 查看函數和過程的狀態
??? ??? SQL>select object_name,status from user_objects where object_type='FUNCTION';
??? ??? SQL>select object_name,status from user_objects where object_type='PROCEDURE';
??? ???
??? ??? 查看函數和過程的源代碼
??????? SQL>set long 1000
??????? SQL>set pagesize 0
??? SQL>set trimspool on
??? ??? SQL>select text from all_source where owner=user and name=upper('&plsql_name');
??? ???
9、觸發器
???
??? ??? 查看觸發器

??? ??? set long 50000;
??? ??? set heading off;
??? ??? set pagesize 2000;

??? ??? select
??? ??? 'create or replace trigger "' ||
??????????? ??? ?trigger_name || '"' || chr(10)||
???? ??? decode( substr( trigger_type, 1, 1 ),
???????????? ??? 'A', 'AFTER', 'B', 'BEFORE', 'I', 'INSTEAD OF' ) ||
????????????????? ??? chr(10) ||
???? ??? triggering_event || chr(10) ||
???? ??? 'ON "' || table_owner || '"."' ||
?????????? ??? table_name || '"' || chr(10) ||
???? ??? decode( instr( trigger_type, 'EACH ROW' ), 0, null,
??? ??? ??????????? 'FOR EACH ROW' ) || chr(10) ,
???? ??? trigger_body
??? ??? from user_triggers;

10. 加密ORACLE的存儲過程
用wrap命令,如:
??? 下列存儲過程內容放在AA.SQL文件中
??? create or replace procedure testCCB(i in number) as
??? begin
??? dbms_output.put_line('輸入參數是'||to_char(i));
??? end;

??? SQL>wrap iname=a.sql;
??? PL/SQL Wrapper: Release 8.1.7.0.0 - Production on Tue Nov 27 22:26:48 2001
??? Copyright (c) Oracle Corporation 1993, 2000.? All Rights Reserved.
??? Processing a.sql to a.plb
??? 提示a.sql轉換為a.plb,這就是加密了的腳本,執行a.plb即可生成加密了的存儲過程
??? 運行a.plb
??? SQL> @a.plb ;

11.怎么樣利用游標更新數據
cursor c1 is
select * from tablename
??? where name is null for update [of column]
...
update tablename set column = ...
where current of c1;

但是如果這種方式打開以后做了commit,則下次fetch會報ora-01002錯誤

12.怎樣自定義異常
pragma_exception_init(exception_name,error_number);
如果立即拋出異常
raise_application_error(error_number,error_msg,true|false);
其中number從-20000到-20999,錯誤信息最大2048B
異常變量
SQLCODE 錯誤代碼
SQLERRM 錯誤信息

13.在pl/sql中執行DDL語句
<1>、8i以下版本dbms_sql包
<2>、8i以上版本還可以用
execute immediate sql;
dbms_utility.exec_ddl_statement('sql');

14.用java寫存儲過程包
<1>
create or replace and compile
java source
named "CHelloWorld" as
public class HelloWorld
{
? public static String print()
? {
???????? return System.out.println("Hello,World");
? }
};
/


<2>
create or replace function my_helloWorld return varchar2
as language java
name 'HelloWorld.print() return java.lang.String';
/

<3>
select my_helloWorld from dual;

--========================================================================================================
--==================================== 三.系統函數和包使用方面 ===========================================
--========================================================================================================
1.十進制和十六進制轉換
(oracle 8i以后)
select to_char(125,'XXXXX') from dual
-----------
?7D
select to_char(125,'xxxxx') from dual
-----------
?7d

select to_number('7D','XXXXX') from dual
-----------
125

2. ORACLE產生隨機函數
DBMS_RANDOM.RANDOM

3、調度程序? DBMS_JOB
??
??? broken?????? 中止一個任務調度
??? change?????? 修改任務的屬性
??? internal???? 改變間隔
??? submit?????? 任務發送到任務隊列中去
??? next_date??? 改變任務的運行時間
??? remove?????? 刪除一個任務
??? run????????? 立即執行一個任務
??? submit?????? 提交一個任務
??? user_export? 任務說明
??? what???????? 改變任務運行的程序
查詢
?? select * from user_job;
?? 建立一存儲過程
?? create or replace procedure log_proc? as
???? begin
????? insert into test(aa) values(sysdate);
????? commit;
???? end;
??? 提交一個任務
???? declare
?????? job_num? number;
???? begin
?????? dbms_job.submit(job_num,'log_proc;',sysdate,sysdate+5/(24*60*60),false);
?????? dbms_output.put_line('Job numer='||to_char(job_num));
???? end;
???? ??? 1> 上面程序從當前開始,間隔5秒執行一次。
???? ??? 2> 如果每天幾點執行,可以寫為(比如從2004-09-13開始執行,每天7點執行)
????????????????????? next_date => to_date('13-09-2004 07:00:00', 'dd-mm-yyyy hh24:mi:ss'),
????????????????????? interval => 'trunc(sysdate)+(7+24)/24')
??????? 3> 如果是每個月幾號開始執行。比如每月2號21點執行。
??????? ??? add_months(trunc(sysdate,'MONTH'),1) + 2-1 + 21/24
???? ???
??? 移走任務
???? begin
?????? dbms_job.remove(1);
???? end;
??? 中止任務
????? begin
??????? dbms_job.broken(1,true);
????? end;
??? 查詢正在執行的job
?? ??? select * from dba_jobs_running
?? ??? 如果運行比較慢,加
?? ??? select /*+ rule */* from dba_jobs_running
4.UTL_FILE包
?在PL/SQL 3.3以上的版本中,UTL_FILE包允許用戶通過PL/SQL讀寫操作系統文件。如下:

DECALRE
FILE_HANDLE UTL_FILE.FILE_TYPE;
BEGIN
FILE_HANDLE:=UTL_FILE.FOPEN('C:/','TEST.TXT','A');
UTL_FILE.PUT_LINE(FILE_HANDLE,'HELLO,IT iS A TEST TXT FILE');
UTL_FILE.FCLOSE(FILE_HANDLE);
END;


比如:怎么樣在Oracle中寫操作系統文件,如寫日志
可以利用utl_file包,但是,在此之前,要注意設置好Utl_file_dir初始化參數
/**************************************************************************
parameter:textContext in varchar2 日志內容
desc: ·寫日志,把內容記到服務器指定目錄下
·必須配置Utl_file_dir初始化參數,并保證日志路徑與Utl_file_dir路徑一致或者是其中一個
****************************************************************************/
CREATE OR REPLACE PROCEDURE sp_Write_log(text_context VARCHAR2)
IS
file_handle utl_file.file_type;
Write_content VARCHAR2(1024);
Write_file_name VARCHAR2(50);
BEGIN
--open file
write_file_name := 'db_alert.log';
file_handle := utl_file.fopen('/u01/logs',write_file_name,'a');
write_content := to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')||'||'||text_context;
--write file
IF utl_file.is_open(file_handle) THEN
utl_file.put_line(file_handle,write_content);
END IF;
--close file
utl_file.fclose(file_handle);
EXCEPTION
WHEN OTHERS THEN
BEGIN
IF utl_file.is_open(file_handle) THEN
utl_file.fclose(file_handle);
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END sp_Write_log;

5.SYS_CONTEXT的詳細用法
select
SYS_CONTEXT('USERENV','TERMINAL') terminal,
SYS_CONTEXT('USERENV','LANGUAGE') language,
SYS_CONTEXT('USERENV','SESSIONID') sessionid,
SYS_CONTEXT('USERENV','INSTANCE') instance,
SYS_CONTEXT('USERENV','ENTRYID') entryid,
SYS_CONTEXT('USERENV','ISDBA') isdba,
SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory,
SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency,
SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar,
SYS_CONTEXT('USERENV','NLS_DATE_formAT') nls_date_format,
SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,
SYS_CONTEXT('USERENV','NLS_SORT') nls_sort,
SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,
SYS_CONTEXT('USERENV','SESSION_USER') session_user,
SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,
SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,
SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,
SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,
SYS_CONTEXT('USERENV','DB_NAME') db_name,
SYS_CONTEXT('USERENV','HOST') host,
SYS_CONTEXT('USERENV','OS_USER') os_user,
SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,
SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,
SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,
SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id,
SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id,
SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type,
SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data
from dual

6.怎么樣在過程中暫停指定時間
DBMS_LOCK包的sleep過程
如:dbms_lock.sleep(5);表示暫停5秒。


7.怎么在Oracle中發郵件
可以利用utl_smtp包發郵件,以下是一個發送簡單郵件的例子程序
/****************************************************************************
parameter: Rcpter in varchar2 接收者郵箱
Mail_Content in Varchar2 郵件內容
desc: ·發送郵件到指定郵箱
·只能指定一個郵箱,如果需要發送到多個郵箱,需要另外的輔助程序
****************************************************************************/
CREATE OR REPLACE PROCEDURE sp_send_mail( rcpter IN VARCHAR2,
mail_content IN VARCHAR2)
IS
conn utl_smtp.connection;

--write title
PROCEDURE send_header(NAME IN VARCHAR2, HEADER IN VARCHAR2) AS
BEGIN
utl_smtp.write_data(conn, NAME||': '|| HEADER||utl_tcp.CRLF);
END;

BEGIN
--opne connect
conn := utl_smtp.open_connection('smtp.com');
utl_smtp.helo(conn, 'oracle');
utl_smtp.mail(conn, 'oracle info');
utl_smtp.rcpt(conn, Rcpter);
utl_smtp.open_data(conn);
--write title
send_header('From', 'Oracle Database');
send_header('To', '"Recipient" ');
send_header('Subject', 'DB Info');
--write mail content
utl_smtp.write_data(conn, utl_tcp.crlf || mail_content);
--close connect
utl_smtp.close_data(conn);
utl_smtp.quit(conn);
EXCEPTION
??? WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN
??? BEGIN
??? ??? utl_smtp.quit(conn);
??? EXCEPTION
??? ??? WHEN OTHERS THEN
??? ??? ??? NULL;
??? END;
??? WHEN OTHERS THEN
??? NULL;
END sp_send_mail;

8.怎么樣獲取對象的DDL語句
第三方工具就不說了主要說一下9i以上版本的dbms_metadata
<1>獲得單個對象的DDL語句
set heading off
set echo off
set feedback off
set pages off
set long 90000
select dbms_metadata.get_ddl('TABLE','TABLE_NAME','SCAME') from dual;
比如
select dbms_metadata.get_ddl('TABLE','CM_USER','AICBS') from dual;
<2>.如果獲取整個用戶的腳本,可以用如下語句
select dbms_metadata.get_ddl('TABLE',u.table_name) from user_tables u;
當然,如果是索引,則需要修改相關table到index
<3>.還有
dbms_metadata.get_xml()



--========================================================================================================
--==================================== 四.DBA管理方面 ====================================================
--========================================================================================================
1、通常oracle需要啟動OracleServiceORCL,OracleStartORCL,OracleTNSListener 任務
??? 在NT上至少要啟動兩個服務
?????? oraclestartID和oracleserverID
每個數據庫都有一個系統標識符(SID),典型安裝的數據庫使用的系統標識符是ORCL

2、啟動關閉數據庫
? 關閉:
?? svrmgr>connect internal/oracle
???????? >shutdown?? --正常關閉數據庫
?? svrmgr>shutdown? immediate? --立即關閉數據庫
?? svrmgr>shutdown abort? --一種最直接的關閉數據庫的方式,執行之后,重新啟動需要花6-8小時
? 啟動:
?? svrmgr>startup? --正常啟動
???????? --等價于:startup nomount;
????????????????? alter database? mount;
????????????????? alter database? open;
?? svrmgr>startup mount; --安裝啟動:用于改變數據庫的歸檔或執行恢復狀態
?? svrmgr>startup nomount;? --用于重建控制文件或重建數據庫
?? svrmgr>startup? restrict; --約束啟動,能啟動數據庫,但只允許具有一定特權的用戶訪問
?? 如果希望改變這種狀態,連接成功后
???? alter system disable restricted session;
?? svrmgr>startup force;當不能關閉數據庫時,可采用強制啟動數據庫來完成數據庫的關閉操作。
?? svrmgr>startup pfile=d:/orant/database/initorcl.ora? --帶初始化參數文件的啟動

3、缺省用戶和密碼
??? <1>. Oracle安裝完成后的初始口令?
?  internal/oracle
  sys/change_on_install
  system/manager
  scott/tiger
  sysman/oem_temp
??? <2>. ORACLE9IAS WEB CACHE的初始默認用戶和密碼?
?? administrator/administrator
4、讓定義自己的回滾段生效
? 在initorcl.ora中加入rollback_segments=(rb0,rb1,...)
? 其中rb0,rb1為自己定義的回滾段,可使這些回滾段在啟動時生效

5、查看修改數據庫的字符集
<1>數據庫服務器字符集???
?? 在表props$中
?? update props$ set value$='ZHS16CGB231280'
???? where name ='NLS_CHARACTERSET'
?? 然后重新啟動數據庫,而不需要重新安裝

?? 8i以上版本可以通過alter database來修改字符集,但也只限于子集到超集,不建議修改props$表,將可能導致嚴重錯誤。
Startup nomount;
Alter database mount exclusive;
Alter system enable restricted session;
Alter system set job_queue_process=0;
Alter database open;
Alter database character set zhs16gbk;

??
??
?? sql> show parameter NLS

?? 查看數據庫字符集:
??? SELECT *? FROM NLS_DATABASE_PARAMETERS;
??? SELECT *? FROM V$NLS_PARAMETERS;
<2>
客戶端字符集環境select * from nls_instance_parameters,其來源于v$parameter,
表示客戶端的字符集的設置,可能是參數文件,環境變量或者是注冊表
會話字符集環境 select * from nls_session_parameters,其來源于v$nls_parameters,表示會話自己的設置,可能是會話的環境變量或者是alter session完成,如果會話沒有特殊的設置,將與nls_instance_parameters一致。
客戶端的字符集要求與服務器一致,才能正確顯示數據庫的非Ascii字符。如果多個設置存在的時候,alter session>環境變量>注冊表>參數文件
字符集要求一致,但是語言設置卻可以不同,語言設置建議用英文。如字符集是zhs16gbk,則nls_lang可以是American_America.zhs16gbk。


<3> 有時候用crontab發起的時候,由于執行的shell腳本的不同,導致很多的環境變量不同。常常看到插入到數據庫中的漢字變成亂碼。
??? 比如shell腳本cai.sh如下內容。
#!/bin/ksh
export ORACLE_BASE=/u01/oracle/app/oracle
export ORACLE_HOME=${ORACLE_BASE}/product/9.2.0
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/lib:$LD_LIBRARY_PATH
export SHLIB_PATH=$ORACLE_HOME/lib32:$ORACLE_HOME/rdbms/lib32:/app/prepay/lib
/u01/oracle/app/oracle/product/9.2.0/bin/sqlplus aicbs/aicbs@busi_cs <<!
insert into okcai values('蔡延壽是個大好人呀');
commit;
quit
!

在crontab中定時每天20:19執行一次
19 20 * * * /bin/sh /app/prepay/cai.sh >/dev/null 2>&1 &

則可以看到數據庫中數據變成了:
2LQSJY
當前數據庫的字符集是
SELECT *? FROM NLS_DATABASE_PARAMETERS
AMERICAN.ZHS16GBK
為了正常,必須保持客戶端和數據庫一致的字符集
改腳本如下即可
#!/bin/ksh
export ORACLE_BASE=/u01/oracle/app/oracle
export ORACLE_HOME=${ORACLE_BASE}/product/9.2.0
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/lib:$LD_LIBRARY_PATH
export SHLIB_PATH=$ORACLE_HOME/lib32:$ORACLE_HOME/rdbms/lib32:/app/prepay/lib
####下面就是增加的
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
/u01/oracle/app/oracle/product/9.2.0/bin/sqlplus aicbs/aicbs@busi_cs <<!
insert into okcai values('蔡延壽是個大好人呀');
commit;
quit
!



6、svgmgr>show sga

7、查詢鎖的原因
?? 如果進程被死鎖,可以按下面方式查詢
??? <1> 從v$session或者v$locked_object找到此session
??? <2> 如果有lockwait,查詢v$lock,
??? ?? select * from v$lock where kaddr = 'C00000024AB87210'
??? ??? 如果沒有,根據sid
??? ??? select * from v$lock where sid = 438
??? <3> 查看v$lock
??? ??? lmode > 0,表示已經得到此鎖
??? ??? request > 0 表示正在請求此鎖
??? ??? 根據id1和id2的值可以判斷請求哪個鎖的釋放。
??? ??? select * from v$lock where id1=134132 and id2 = 31431

8. 查詢鎖的狀況的對象
?V$LOCK,? V$LOCKED_OBJECT,? V$SESSION,? V$SQLAREA,? V$PROCESS ;
?? 查詢鎖的表的方法:
SELECT S.SID SESSION_ID, S.USERNAME,
DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(LMODE)) MODE_HELD,
DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(REQUEST)) MODE_REQUESTED,
O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')', S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1, L.ID2 LOCK_ID2
FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S
WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID ;

9. 怎樣查得數據庫的SID ?
select name from v$database;
也可以直接查看 init.ora文件

10、管理回滾段:
??? 存放事務的恢復信息
??? 建立回滾段
????? create public? rollback segment SEG_NAME? tabelspace TABLESPACE_NAME;
????? alter?? rollback segment SEG_NAME? online;
??? 刪除回滾段
????? 首先改變為offline狀態
??? 直接使用回滾段
??? sql>set transaction? use? rollback? segment? SEG_NAME;

11. 計算一個表占用的空間的大小
select owner,table_name,
NUM_ROWS,
BLOCKS*AAA/1024/1024 "Size M",
EMPTY_BLOCKS,
LAST_ANALYZED
from dba_tables
where table_name='XXX';

Here: AAA is the value of db_block_size ;
XXX is the table name you want to check


12. 表在表空間中的存儲情況
?? select segment_name,sum(bytes),count(*) ext_quan from dba_extents where
?? tablespace_name='&tablespace_name' and segment_type='TABLE' group by?????? tablespace_name,segment_name;

13. 索引在表空間中的存儲情況
?? select segment_name,count(*) from dba_extents where segment_type='INDEX' and?????? owner='&owner'
?? group by segment_name;

14.查看某表/索引的大小
??? 表
??? ??? SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
??? ??? ??? where segment_name=upper('&table_name');
?????? 索引
??? ??? SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
??? ??? ??? where segment_name=upper('&index_name');

15、確定可用空間
??? select tablespace_name,sum(blocks),sum(bytes) from sys.dba_free_space group by tablespace_name;

16、程序中報錯:maxinum cursor exceed!
? <1> 查看當前的open cursor參數
?? sql> show parameter open_cursors
? <2> 如果確實很小,應該調整數據庫初始化文件
?? 加如一項? open_cursors=200
? <3> 如果很大,則
select sid,sql_text,count(*) from v$open_cursor
group by sid,sql_text
having count(*) > 200
??? 其中200是隨便寫一個比較大的值。查詢得到打開太多的cursor.

17、查看數據庫的版本信息
SQL> select? * from v$version;
包含版本信息,核心版本信息,位數信息(32位或64位)等
至于位數信息,在linux/unix平臺上,可以通過file查看,如
file $ORACLE_HOME/bin/oracle

18. 查看最大會話數
??? SELECT * FROM V$PARAMETER WHERE NAME LIKE 'proc%';
??? SQL>
??? SQL> show parameter processes
??? NAME TYPE VALUE
??? ------------------------------------ ------- ------------------------------
??? aq_tm_processes integer 1
??? db_writer_processes integer 1
??? job_queue_processes integer 4
??? log_archive_max_processes integer 1
??? processes integer 200
???
??? 這里為200個用戶。

??? select * from v$license;
??? 其中sessions_highwater紀錄曾經到達的最大會話數

19. 以archivelog的方式運行oracle。
init.ora
log_archive_start = true
RESTART DATABASE

20. unix 下調整數據庫的時間
su -root
date -u 08010000

21.P4電腦的安裝方法
??? 將SYMCJIT.DLL改為SYSMCJIT.OLD

22. 如何查詢SERVER是不是OPS?
SELECT *? FROM V$OPTION;
如果PARALLEL SERVER=TRUE則有OPS能

23. 查詢每個用戶的權限
SELECT *? FROM DBA_SYS_PRIVS;

24.將表/索引移動表空間
ALTER TABLE TABLE_NAME MOVE TABLESPACE_NAME;
ALTER INDEX INDEX_NAME REBUILD TABLESPACE TABLESPACE_NAME;

25.在LINUX,UNIX下啟動DBA STUDIO?
OEMAPP? DBASTUDIO

26.LINUX下查詢磁盤競爭狀況命令?
Sar? -d

27.LINUX下查詢磁盤CPU競爭狀況命令?
sar?? -r

28. 查詢表空間信息?
SELECT *? FROM? DBA_DATA_FILES;

29. 看各個表空間占用磁盤情況:

SQL> col tablespace format a20
????? SQL> select
????? b.file_id????????????????????????????????????????????????????????? 文件ID號,
????? b.tablespace_name???????????????????????????????????????????????????? 表空間名,
????? b.bytes?????????????????????????????????????????????????????????? 字節數,
????? (b.bytes-sum(nvl(a.bytes,0)))??????????????????????? 已使用,
????? sum(nvl(a.bytes,0))???????????????????????????????????????????????????? 剩余空間,
????? sum(nvl(a.bytes,0))/(b.bytes)*100???????????????????? 剩余百分比
????? from dba_free_space a,dba_data_files b
????? where a.file_id=b.file_id
????? group by b.tablespace_name,b.file_id,b.bytes
????? order by b.file_id
?
30. 如把ORACLE設置為MTS或專用模式?
#dispatchers="(PROTOCOL=TCP) (SERVICE=SIDXDB)"
加上就是MTS,注釋就是專用模式,SID是指你的實例名。

31. 如何才能得知系統當前的SCN號 ?
select max(ktuxescnw * power(2, 32) + ktuxescnb) from x$ktuxe;



32. 修改oracel數據庫的默認日期
?alter session set nls_date_format='yyyymmddhh24miss';
?? OR
?可以在init.ora中加上一行
?nls_date_format='yyyymmddhh24miss'

33. 將小表放入keep池中
alter table xxx storage(buffer_pool keep);

34. 如何檢查是否安裝了某個patch?
?check that? oraInventory

35. 如何修改oracle數據庫的用戶連接數?
修改initSID.ora,將process加大,重啟數據庫.

36. 如何創建SPFILE?

SQL> connect / as sysdba
?SQL> select * from v$version;
?SQL> create pfile from spfile;
SQL> CREATE SPFILE FROM PFILE='E:/ora9i/admin/eygle/pfile/init.ora';

文件已創建。
SQL> CREATE SPFILE='E:/ora9i/database/SPFILEEYGLE.ORA' FROM PFILE='E:/ora9i/admin/eygle/pfile/init.ora';
文件已創建。


37. 內核參數的應用
??? shmmax
  含義:這個設置并不決定究竟Oracle數據庫或者操作系統使用多少物理內存,只決定了最多可以使用的內存數目。這個設置也不影響操作系統的內核資源。
  設置方法:0.5*物理內存
  例子:Set shmsys:shminfo_shmmax=10485760
  shmmin
  含義:共享內存的最小大小。
  設置方法:一般都設置成為1。
  例子:Set shmsys:shminfo_shmmin=1:
  shmmni
  含義:系統中共享內存段的最大個數。
  例子:Set shmsys:shminfo_shmmni=100
  shmseg
  含義:每個用戶進程可以使用的最多的共享內存段的數目。
  例子:Set shmsys:shminfo_shmseg=20:
  semmni
  含義:系統中semaphore identifierer的最大個數。
  設置方法:把這個變量的值設置為這個系統上的所有Oracle的實例的init.ora中的最大的那個processes的那個值加10。
  例子:Set semsys:seminfo_semmni=100
  semmns
  含義:系統中emaphores的最大個數。
  設置方法:這個值可以通過以下方式計算得到:各個Oracle實例的initSID.ora里邊的processes的值的總和(除去最大的Processes參數)+最大的那個Processes×2+10×Oracle實例的個數。
  例子:Set semsys:seminfo_semmns=200
  semmsl:
  含義:一個set中semaphore的最大個數。
  設置方法:設置成為10+所有Oracle實例的InitSID.ora中最大的Processes的值。
  例子:Set semsys:seminfo_semmsl=-200

38. 怎樣查看哪些用戶擁有SYSDBA、SYSOPER權限?

SQL>conn sys/change_on_install
SQL>select * from V_$PWFILE_USERS;


?
39. 如何查看數據文件放置的路徑 ?
col file_name format a50
SQL> select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id;

40. 如何查看現有回滾段及其狀態 ?
SQL> col segment format a30
SQL> SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM DBA_ROLLBACK_SEGS


41. Oracle常用系統文件有哪些?
通過以下視圖顯示這些文件信息:v$database,v$datafile,v$logfile v$controlfile v$parameter;

42.查看數據庫實例
SQL>SELECT * FROM V$INSTANCE;

43. 怎樣估算SQL執行的I/O數 ?
SQL>SET AUTOTRACE ON ;
SQL>SELECT * FROM TABLE;
OR
SQL>SELECT *? FROM? v$filestat ;

可以查看IO數

44. 怎樣擴大REDO LOG的大小?
建立一個臨時的redolog組,然后切換日志,刪除以前的日志,建立新的日志。


45. 查詢做比較大的排序的進程?
?? <1>
?? SELECT b.tablespace, b.segfile#, b.segblk#, b.blocks, a.sid, a.serial#,
?? a.username, a.osuser, a.status
?? FROM v$session a,v$sort_usage b
?? WHERE a.saddr = b.session_addr
?? ORDER BY b.tablespace, b.segfile#, b.segblk#, b.blocks ;

? <2>. 查詢做比較大的排序的進程的SQL語句
?? select /*+ ORDERED */ sql_text from v$sqltext a
?? where a.hash_value = (
?? select sql_hash_value from v$session b
?? where b.sid = &sid and b.serial# = &serial)
?? order by piece asc ;

46. ORA-01555 SNAPSHOT TOO OLD的解決辦法
?? 增加MINEXTENTS的值,增加區的大小,設置一個高的OPTIMAL值。
?? 如果是執行大的事務,報此錯誤,說明oracle給此事務隨機分配的回滾段太小了,這時可以為它指定一個足夠大的回滾段,以確保這個事務的成功執行.例如

set transaction use rollback segment roll_abc;
delete from table_name where ...
commit;
  回滾段roll_abc被指定給這個delete事務,commit命令則在事務結束之后取消了回滾段的指定.

???
47. 事務要求的回滾段空間不夠,表現為表空間用滿(ORA-01560錯誤),回滾段擴展到達參數????? MAXEXTENTS的值(ORA-01628)的解決辦法.
?? 向回滾段表空間添加文件或使已有的文件變大;增加MAXEXTENTS的值。

???
48. 監控事例的等待
?? select event,sum(decode(wait_Time,0,0,1)) "Prev",
?? sum(decode(wait_Time,0,1,0)) "Curr",count(*) "Tot"
?? from v$session_Wait
?? group by event order by 4;

49. 回滾段的爭用情況
?? select name, waits, gets, waits/gets "Ratio"
?? from v$rollstat C, v$rollname D
?? where C.usn = D.usn;

50 監控表空間的 I/O 比例
?? select B.tablespace_name name,B.file_name "file",A.phyrds pyr,
?? A.phyblkrd pbr,A.phywrts pyw, A.phyblkwrt pbw
?? from v$filestat A, dba_data_files B
?? where A.file# = B.file_id
?? order by B.tablespace_name;

51、監控文件系統的 I/O 比例
?? select substr(C.file#,1,2) "#", substr(C.name,1,30) "Name",
?? C.status, C.bytes, D.phyrds, D.phywrts
?? from v$datafile C, v$filestat D
?? where C.file# = D.file#;

52、監控 SGA 的命中率
?? select a.value + b.value "logical_reads", c.value "phys_reads",
?? round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO"
?? from v$sysstat a, v$sysstat b, v$sysstat c
?? where a.statistic# = 38 and b.statistic# = 39
?? and c.statistic# = 40;

53、監控 SGA 中字典緩沖區的命中率
?? select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio",
?? (1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio"
?? from v$rowcache
?? where gets+getmisses <>0
?? group by parameter, gets, getmisses;

54、監控 SGA 中共享緩存區的命中率,應該小于1%
?? select sum(pins) "Total Pins", sum(reloads) "Total Reloads",
?? sum(reloads)/sum(pins) *100 libcache
?? from v$librarycache;

?? select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins)??? "reload percent"
?? from v$librarycache;

55、顯示所有數據庫對象的類別和大小
?? select count(name) num_instances ,type ,sum(source_size) source_size ,
?? sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size)??? error_size,
?? sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size)??? size_required
?? from dba_object_size
?? group by type order by 2;

56、監控 SGA 中重做日志緩存區的命中率,應該小于1%
?? SELECT name, gets, misses, immediate_gets, immediate_misses,
?? Decode(gets,0,0,misses/gets*100) ratio1,
?? Decode(immediate_gets+immediate_misses,0,0,
?? immediate_misses/(immediate_gets+immediate_misses)*100) ratio2
?? FROM v$latch WHERE name IN ('redo allocation', 'redo copy');

57、監控內存和硬盤的排序比率,最好使它小于 .10,增加 sort_area_size
?? SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts????? (disk)');


58、監控當前數據庫誰在運行什么SQL語句?
?? SELECT osuser, username, sql_text from v$session a, v$sqltext b
?? where a.sql_address =b.address order by address, piece;

59、監控字典緩沖區?
?? SELECT (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM V$LIBRARYCACHE;
?? SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) "ROW CACHE" FROM??? V$ROWCACHE;
?? SELECT SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" FROM??? V$LIBRARYCACHE;
?? 后者除以前者,此比率小于1%,接近0%為好。

?? SELECT SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES) "DICTIONARY CACHE GET MISSES"
?? FROM V$ROWCACHE


60、監控 MTS
?? select busy/(busy+idle) "shared servers busy" from v$dispatcher;
?? 此值大于0.5時,參數需加大
?? select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where??? type='dispatcher';
?? select count(*) from v$dispatcher;
?? select servers_highwater from v$mts;
?? servers_highwater接近mts_max_servers時,參數需加大


61、查看碎片程度高的表?
?? SELECT segment_name table_name , COUNT(*) extents
?? FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name
?? HAVING COUNT(*) = (SELECT MAX( COUNT(*) ) FROM dba_segments GROUP BY?????? segment_name);


62、如何知道使用CPU多的用戶session?
?? 11是cpu used by this session

?? select a.sid,spid,status,substr(a.program,1,40)?????? prog,a.terminal,osuser,value/60/100 value
?? from v$session a,v$process b,v$sesstat c
?? where c.statistic#=11 and c.sid=a.sid and a.paddr=b.addr order by value desc;


63.如何檢查操作系統是否存在IO的問題
??? 使用的工具有sar,這是一個比較通用的工具。
??? #sar -u 2 10
??? 即每隔2秒檢察一次,共執行20次,當然這些都由你決定了。
? ??? ??? 示例返回:
? ??? ??? HP-UX hpn2 B.11.00 U 9000/800??? 08/05/03
? ??? ??? 18:26:32??? %usr??? %sys??? %wio?? %idle
? ??? ??? 18:26:34????? 80?????? 9????? 12?????? 0
? ??? ??? 18:26:36????? 78????? 11????? 11?????? 0
? ??? ??? 18:26:38????? 78?????? 9????? 13?????? 1
? ??? ??? 18:26:40????? 81????? 10?????? 9?????? 1
? ??? ??? 18:26:42????? 75????? 10????? 14?????? 0
? ??? ??? 18:26:44????? 76?????? 8????? 15?????? 0
? ??? ??? 18:26:46????? 80?????? 9????? 10?????? 1
? ??? ??? 18:26:48????? 78????? 11????? 11?????? 0
? ??? ??? 18:26:50????? 79????? 10????? 10?????? 0
? ??? ??? 18:26:52????? 81????? 10?????? 9?????? 0
? ??? ???
? ??? ??? Average?????? 79????? 10????? 11?????? 0
??? 其中的%usr指的是用戶進程使用的cpu資源的百分比,
??? %sys指的是系統資源使用cpu資源的百分比,
??? %wio指的是等待io完成的百分比,這是值得我們觀注的一項,
??? %idle即空閑的百分比。如果wio列的值很大,如在35%以上,說明你的系統的IO存在瓶頸,你的CPU花費了很大的時間去等待IO的完成。
??? Idle很小說明系統CPU很忙。像我的這個示例,可以看到wio平均值為11說明io沒什么特別的問題,而我的idle值為零,說明我的cpu已經滿負荷運行了。

64.關注一下內存。
??? 常用的工具便是vmstat,對于hp-unix來說可以用glance,Aix來說可以用topas,當你發現vmstat中pi列非零,memory中的free列的值很小,glance,topas中內存的利用率多于80%時,這時說明你的內存方面應該調節一下了,方法大體有以下幾項。
? a.劃給Oracle使用的內存不要超過系統內存的1/2,一般保在系統內存的40%為益。
? b.為系統增加內存
? c.如果你的連接特別多,可以使用MTS的方式
? d.打全補丁,防止內存漏洞。

65、查找前十條性能差的sql.
?SELECT * FROM
? (
?? SELECT PARSING_USER_ID
????????? EXECUTIONS,
????????? SORTS,
????????? COMMAND_TYPE,
????????? DISK_READS,
????????? sql_text
????? FROM? v$sqlarea
???? ORDER BY disk_reads DESC
?? )?
? WHERE ROWNUM<10 ;

66、查看占io較大的正在運行的session
?SELECT se.sid,
?????? se.serial#,
?????? pr.SPID,
?????? se.username,
?????? se.status,
?????? se.terminal,
?????? se.program,
?????? se.MODULE,
?????? se.sql_address,
?????? st.event,
?????? st.p1text,
?????? si.physical_reads,
?????? si.block_changes
? FROM v$session se,
?????? v$session_wait st,
?????? v$sess_io si,
?????? v$process pr
?WHERE st.sid=se.sid
?? AND st.sid=si.sid
?? AND se.PADDR=pr.ADDR
?? AND se.sid>6
?? AND st.wait_time=0
?? AND st.event NOT LIKE '%SQL%'
?ORDER BY physical_reads DESC
對檢索出的結果的幾點說明:
?<1> 我是按每個正在等待的session已經發生的物理讀排的序,因為它與實際的IO相關。
?<2> 你可以看一下這些等待的進程都在忙什么,語句是否合理?
? Select sql_address from v$session where sid=<sid>;
? Select * from v$sqltext where address=<sql_address>;
??? 執行以上兩個語句便可以得到這個session的語句。
??? 你也以用alter system kill session 'sid,serial#';把這個session殺掉。
?<3> 應觀注一下event這列,這是我們調優的關鍵一列,下面對常出現的event做以簡要的說明:
??? a、buffer busy waits,free buffer waits這兩個參數所標識是dbwr是否夠用的問題,與IO很大相關的,當v$session_wait中的free buffer wait的條目很小或沒有的時侯,說明你的系統的dbwr進程決對夠用,不用調整;free buffer wait的條目很多,你的系統感覺起來一定很慢,這時說明你的dbwr已經不夠用了,它產生的wio已經成為你的數據庫性能的瓶頸,這時的解決辦法如下:
??? a.1增加寫進程,同時要調整db_block_lru_latches參數
??? ??? 示例:修改或添加如下兩個參數
??? ? ??? ? db_writer_processes=4
??? ??? ? db_block_lru_latches=8
??? a.2開異步IO,IBM這方面簡單得多,hp則麻煩一些,可以與Hp工程師聯系。
??? b、db file sequential read,指的是順序讀,即全表掃描,這也是我們應該盡量減少的部分,解決方法就是使用索引、sql調優,同時可以增大db_file_multiblock_read_count這個參數。
??? c、db file scattered read,這個參數指的是通過索引來讀取,同樣可以通過增加db_file_multiblock_read_count這個參數來提高性能。
??? d、latch free,與栓相關的了,需要專門調節。
??? e、其他參數可以不特別觀注。



67. 文件說明
??? <1>監聽器日志文件
?? 以8I為例
?? $ORACLE_HOME/NETWORK/LOG/LISTENER.LOG

??? <2>. 監聽器參數文件
?? 以8I為例
?? $ORACLE_HOME/NETWORK/ADMIN/LISTENER.ORA

??? <3>. TNS 連接文件
?? 以8I為例
?? $ORACLE_HOME/NETWORK/ADMIN/TNSNAMES.ORA

??? <4>. Sql*Net 環境文件
?? 以8I為例
?? $ORACLE_HOME/NETWORK/ADMIN/SQLNET.ORA

??? <5>. 警告日志文件
?? 以8I為例
?? $ORACLE_HOME/ADMIN/SID/BDUMP/SIDALRT.LOG

??? <6>. 基本結構
?? 以8I為例
?? $ORACLE_HOME/RDBMS/ADMIN/STANDARD.SQL

??? <7>. 建立數據字典視圖
?? 以8I為例
?? $ORACLE_HOME/RDBMS/ADMIN/CATALOG.SQL

??? <8>.建立審計用數據字典視圖
?? 以8I為例
?? $ORACLE_HOME/RDBMS/ADMIN/CATAUDIT.SQL

??? <9>. 建立快照用數據字典視圖
?? 以8I為例
?? $ORACLE_HOME/RDBMS/ADMIN/CATSNAP.SQL

68、oracle 安全與審計
?? user_sys_privs,user_tab_privs;
配置文件
?? 主要參數
?? session_per_user? 每個用戶可同時進行幾個會話
?? cpu_per_session?? 每個用戶可用多少個(cpu的)百分之一秒
?? cpu_per_call????? 語法分析、執行、取數可用多少個百分之一秒
?? connect_time????? 用戶連接數據庫的時間(分鐘)
?? idle_time???????? 用戶不調用數據庫的時間(分鐘)
?? logical_reads_per_session? 整個會話過程中用戶訪問oracle的塊數
?? logical_reads_per_call???? 一次調用用戶訪問oracle的塊數
?? private_SGA?????? 一個用戶進程所用SGA的內存數量
?? composite_limit?? 復合限制數
?? failed_login_attempts 連續多次注冊失敗引起一個帳戶死鎖
?? password_life_time??? 一個口令在其終止前可用的天數
?? password_reuse_time??? 一個口令在其n天才能重新使用
?? password_reuse_max??? 一個口令在重新使用之前必須改變多少次
?? password_lock_time??? 一個口令帳戶被鎖住的天數
69、管理初始化文件
?? show parameters
?? 經常修改的項目有? v$parameter
?? shared_pool_size? 分配給共享的字節數
?? rollback_segments 回滾段的個數
?? sessions????????? 會話個數
?? processes???????? 進程個數
70、管理控制文件
??? 控制文件保存文件有關數據庫創建時間、數據庫名以及數據庫運行時使用的所有文件位置和名稱。
??? 增加控制文件,在initorcl.ora中,找到control_file項,增加一項即可
??? 刪除控制文件,在initorcl.ora中去掉,然后刪除物理文件
??? 建立新的控制文件
??? create controlfile? [reuse] [set] database? 數據庫名?
??????? logfile [group 整數] 文件名 [,[group 整數] 文件名],...
??? 對于現有的數據庫,可以間接地通過
??? alter database backup? controlfile? to trace命令生成控制文件,即可在/orant/rmb73/trace
??? 下有ora00289.trc文件,其內容為文本

71、日志管理
??? <1>建立日志組
??? sql>select * from v$logfile;
??? sql>alter database add logfile group 3
??????? ('f:/orant/database/log1_g3.ora'
???????? 'f:/orant/database/log2_g3.ora') size 100k;
??? sql>select * from v$logfile;

??? ----
??? sql> alter database add logfile group 4
??? ?('/disk3/log4a.rdo','/disk4/log4b.rdo') size 1m;



??? <2>刪除日志組
????? alter database? drop logfile group 1;
????? 但是其物理文件并沒有被刪除掉
??????? 系統至少需要2個日志組,如果只有2個,就不能刪除
??????? 不能刪除正活動的日志組
??? <3>手工歸檔
????? 通過alter system 的archive log 子句來實現
????????? archive? log [thread 整數]
????????? [seq 整數][change 整數][current][group 整數]
????????? [logfile '文件名'][next][all][start][to '位置']
?? <4> 強制日志切換
??? sql> alter system switch logfile;
?? <5> 強制checkpoints
??????? sql> alter system checkpoint;
?? <6> adding online redo log members
??? sql>alter database add logfile member
??? ??? '/disk3/log1b.rdo' to group 1,
??? ??? '/disk4/log2b.rdo' to group 2;
?? <7>.changes the name of the online redo logfile
??? sql> alter database rename file 'c:/oracle/oradata/oradb/redo01.log'
??? ??? to 'c:/oracle/oradata/redo01.log';
?? <8> drop online redo log members
??? sql> alter database drop logfile member 'c:/oracle/oradata/redo01.log';
?? <9>.clearing online redo log files
??? sql> alter database clear [unarchived] logfile 'c:/oracle/log2a.rdo';
?? <10>.using logminer analyzing redo logfiles
??? a. in the init.ora specify utl_file_dir = ' '
??? b. sql> execute dbms_logmnr_d.build('oradb.ora','c:/oracle/oradb/log');
??? c. sql> execute dbms_logmnr_add_logfile('c:/oracle/oradata/oradb/redo01.log',
??? ?? sql> dbms_logmnr.new);
??? d. sql> execute dbms_logmnr.add_logfile('c:/oracle/oradata/oradb/redo02.log',
??? ?? sql> dbms_logmnr.addfile);
??? e. sql> execute dbms_logmnr.start_logmnr(dictfilename=>'c:/oracle/oradb/log/oradb.ora');
??? f. sql> select * from v$logmnr_contents(v$logmnr_dictionary,v$logmnr_parameters
??? ?? sql> v$logmnr_logs);
??? g. sql> execute dbms_logmnr.end_logmnr;


72 系統控制
?? alter system ...
??
?? alter system enable restricted session;? 只允許具有restricted系統特權的用戶登錄
?? alter system flush? shared_pool? 清除共享池
?? alter system checkpoint?? 執行一 個檢查點
?? alter system set license_max_session=64,license_session_warning=54 會話限制為64,會話的警界為54
?? alter system set license_max_session=0 會話數為無限制
?? alter system set license_max_users=300 用戶限制為300個
?? alter system switch logfile? 強制執行日志轉換
73 會話控制
?? alter session
??
?? alter session set sql_trace=true? 當前會話具有sql跟蹤功能
?? alter session set NLS_language=French 出錯信息設為法語
?? alter session set NLS_date_format='YYYY MM DD HH24:MI:SS';缺省日期格式
?? alter session set optimizier_goal=first_row改變優化方法為基于開銷方法,具有快速響應速度
?? update student@teach set sold=sold+1 where sno='98010';
?? commit;
?? alter session close database link teach; 關閉遠程鏈路
74、封鎖機制
?? 數據封鎖:保護表數據,在多個用戶并行存取數據時候,保證數據的完整性。
?? DML操作又在兩個級別獲取數據封鎖:指定記錄封鎖和表封鎖
?? 表封鎖可以有下列方式:行共享(RS),行排他(RX),共享封鎖(S),共享行排他(SPX)和排他
?? 封鎖(X)
?? 行共享表封鎖(RS),允許其他事務并行查詢、插入,修改和刪除及再行封鎖
?? select ...from? 表名? ...? for update of ...;
?? lock table 表名? in row share mode;
?? 行排他表封鎖(RX) 對該行有獨占權利
?? insert into 表名 ...;
?? update 表名 ...;
?? delete from 表名 ...;
?? lock table 表名 in row exclusive mode;
?? 允許并行查詢、插入、刪除或封鎖其他行,但禁止其他事務使用下列命令進行并發封鎖:
???? lock table 表名 in share mode;
???? lock table 表名 in share exclusive mode;
???? lock table 表名 in exclusive mode;
?? 共享表封鎖(S)
???? lock table 表名 in share mode;
???? 允許其他事務可在該表上做查詢和再實現共享表操作,但不能修改該表,同時也不能做如下封鎖:
?????? lock table 表名 in share row exclusive mode;
?????? lock table 表名 in? exclusive? mode;
?????? lock table 表名 in row exclusive mode;
?? 共享排他表封鎖(SRX)
????? lock table 表名 in share row exclusive mode;
?? 排他表封鎖(SRX)
????? lock table 表名 in? exclusive mode;??


75、設置事務
?? set transaction [read only][read write][use rollback segment 回滾段名]

76.如果希望用aimtzmcc用戶連接數據庫,訪問aicbs用戶的表,不在表名前綴"aicbs.",可以在建立數據庫連接后發下面的命令
?????????? alter session set current_schema = aicbs;

77、表空間管理
??? <1> 創建表空間
??? sql> create tablespace tablespace_name datafile 'c:/oracle/oradata/file1.dbf' size 100m,
??? sql> 'c:/oracle/oradata/file2.dbf' size 100m minimum extent 550k [logging/nologging]
??? sql> default storage (initial 500k next 500k maxextents 500 pctinccease 0)
??? sql> [online/offline] [permanent/temporary] [extent_management_clause]
??? <2>.locally managed tablespace
??? sql> create tablespace user_data datafile 'c:/oracle/oradata/user_data01.dbf'
??? sql> size 500m extent management local uniform size 10m;
??? <3>.temporary tablespace
??? sql> create temporary tablespace temp tempfile 'c:/oracle/oradata/temp01.dbf'
??? sql> size 500m extent management local uniform size 10m;
??? <4>.change the storage setting
??? sql> alter tablespace app_data minimum extent 2m;
??? sql> alter tablespace app_data default storage(initial 2m next 2m maxextents 999);
??? <5>.taking tablespace offline or online
??? sql> alter tablespace app_data offline;
??? sql> alter tablespace app_data online;
??? <6>.read_only tablespace
??? sql> alter tablespace app_data read only|write;
??? <7>.droping tablespace
??? sql> drop tablespace app_data including contents;
??? <8>.enableing automatic extension of data files
??? sql> alter tablespace app_data add datafile 'c:/oracle/oradata/app_data01.dbf' size 200m
??? sql> autoextend on next 10m maxsize 500m;
??? <9>.change the size fo data files manually
??? sql> alter database datafile 'c:/oracle/oradata/app_data.dbf' resize 200m;
?? <10>.Moving data files: alter tablespace
??? sql> alter tablespace app_data rename datafile 'c:/oracle/oradata/app_data.dbf'
??? sql> to 'c:/oracle/app_data.dbf';
?? <11>.moving data files:alter database
??? sql> alter database rename file 'c:/oracle/oradata/app_data.dbf'
??? sql> to 'c:/oracle/app_data.dbf';

78、BACKUP and RECOVERY

<1>. v$sga,v$instance,v$process,v$bgprocess,v$database,v$datafile,v$sgastat

<2>. Rman need set dbwr_IO_slaves or backup_tape_IO_slaves and large_pool_size

<3>. Monitoring Parallel Rollback
?v$fast_start_servers , v$fast_start_transactions

<4>.perform a closed database backup (noarchivelog)
?shutdown immediate
?cp files /backup/
?startup

<5>.restore to a different location
connect system/manager as sysdba
startup mount
alter database rename file '/disk1/../user.dbf' to '/disk2/../user.dbf';
alter database open;

<6>.recover syntax
--recover a mounted database
recover database;
recover datafile '/disk1/data/df2.dbf';
alter database recover database;
--recover an opened database
recover tablespace user_data;
recover datafile 2;
alter database recover datafile 2;

<7>.how to apply redo log files automatically
set autorecovery on
recover automatic datafile 4;

<8>.complete recovery:
--method 1(mounted databae)
copy c:/backup/user.dbf c:/oradata/user.dbf
startup mount
recover datafile 'c:/oradata/user.dbf;
alter database open;
--method 2(opened database,initially opened,not system or rollback datafile)
copy c:/backup/user.dbf c:/oradata/user.dbf (alter tablespace offline)
recover datafile 'c:/oradata/user.dbf' or
recover tablespace user_data;
alter database datafile 'c:/oradata/user.dbf' online or
alter tablespace user_data online;
--method 3(opened database,initially closed not system or rollback datafile)
startup mount
alter database datafile 'c:/oradata/user.dbf' offline;
alter database open
copy c:/backup/user.dbf d:/oradata/user.dbf
alter database rename file 'c:/oradata/user.dbf' to 'd:/oradata/user.dbf'
recover datafile 'e:/oradata/user.dbf' or recover tablespace user_data;
alter tablespace user_data online;
--method 4(loss of data file with no backup and have all archive log)
alter tablespace user_data offline immediate;
alter database create datafile 'd:/oradata/user.dbf' as 'c:/oradata/user.dbf''
recover tablespace user_data;
alter tablespace user_data online
<9>.perform an open database backup
alter tablespace user_data begin backup;
copy files /backup/
alter database datafile '/c:/../data.dbf' end backup;
alter system switch logfile;
<10>.backup a control file
alter database backup controlfile to 'control1.bkp';
alter database backup controlfile to trace;
<11>.recovery (noarchivelog mode)
shutdown abort
cp files
startup
<12>.recovery of file in backup mode
alter database datafile 2 end backup;

<13>.clearing redo log file
alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1 unrecoverable datafile;

<14>.redo log recovery
alter database add logfile group 3 'c:/oradata/redo03.log' size 1000k;
alter database drop logfile group 1;
alter database open;
or >cp c:/oradata/redo02.log' c:/oradata/redo01.log
alter database clear logfile 'c:/oradata/log01.log';

79 managing password security and resources

<1>.controlling account lock and password
sql> alter user juncky identified by oracle account unlock;

<2>.user_provided password function
sql> function_name(userid in varchar2(30),password in varchar2(30),
old_password in varchar2(30)) return boolean

<3>.create a profile : password setting
sql> create profile grace_5 limit failed_login_attempts 3
sql> password_lock_time unlimited password_life_time 30
sql>password_reuse_time 30 password_verify_function verify_function
sql> password_grace_time 5;

<4>.altering a profile
sql> alter profile default failed_login_attempts 3
sql> password_life_time 60 password_grace_time 10;

<5>.drop a profile
sql> drop profile grace_5 [cascade];

<6>.create a profile : resource limit
sql> create profile developer_prof limit sessions_per_user 2
sql> cpu_per_session 10000 idle_time 60 connect_time 480;

<7>. view => resource_cost : alter resource cost
dba_Users,dba_profiles

<8>. enable resource limits
sql> alter system set resource_limit=true;


80.managing privileges

<1>.system privileges: view => system_privilege_map ,dba_sys_privs,session_privs

<2>.grant system privilege
sql> grant create session,create table to managers;
sql> grant create session to scott with admin option;
with admin option can grant or revoke privilege from any user or role;

<3>.sysdba and sysoper privileges:
sysoper: startup,shutdown,alter database open|mount,alter database backup controlfile,
alter tablespace begin/end backup,recover database
alter database archivelog,restricted session
sysdba: sysoper privileges with admin option,create database,recover database until

<4>.password file members: view:=> v$pwfile_users

<5>.O7_dictionary_accessibility =true restriction access to view or tables in other schema

<6>.revoke system privilege
sql> revoke create table from karen;
sql> revoke create session from scott;

<7>.grant object privilege
sql> grant execute on dbms_pipe to public;
sql> grant update(first_name,salary) on employee to karen with grant option;

<8>.display object privilege : view => dba_tab_privs, dba_col_privs

<9>.revoke object privilege
sql> revoke execute on dbms_pipe from scott [cascade constraints];

<10>.audit record view :=> sys.aud$

<11>. protecting the audit trail
sql> audit delete on sys.aud$ by access;

<12>.statement auditing
sql> audit user;

<13>.privilege auditing
sql> audit select any table by summit by access;

<14>.schema object auditing
sql> audit lock on summit.employee by access whenever successful;

<15>.view audit option : view=> all_def_audit_opts,dba_stmt_audit_opts,dba_priv_audit_opts,dba_obj_audit_opts

<16>.view audit result: view=> dba_audit_trail,dba_audit_exists,dba_audit_object,dba_audit_session,dba_audit_statement

81 manager role

<1>.create roles
sql> create role sales_clerk;
sql> create role hr_clerk identified by bonus;
sql> create role hr_manager identified externally;

<2>.modify role
sql> alter role sales_clerk identified by commission;
sql> alter role hr_clerk identified externally;
sql> alter role hr_manager not identified;

<3>.assigning roles
sql> grant sales_clerk to scott;
sql> grant hr_clerk to hr_manager;
sql> grant hr_manager to scott with admin option;

<4>.establish default role
sql> alter user scott default role hr_clerk,sales_clerk;
sql> alter user scott default role all;
sql> alter user scott default role all except hr_clerk;
sql> alter user scott default role none;

<5>.enable and disable roles
sql> set role hr_clerk;
sql> set role sales_clerk identified by commission;
sql> set role all except sales_clerk;
sql> set role none;

<6>.remove role from user
sql> revoke sales_clerk from scott;
sql> revoke hr_manager from public;

<7>.remove role
sql> drop role hr_manager;

<8>.display role information
view: =>dba_roles,dba_role_privs,role_role_privs,dba_sys_privs,role_sys_privs,role_tab_privs,session_roles


81.查詢當前正在執行的job的情況
?? 有時候對于需要執行的job查詢執行情況,比如正在執行那條語句,或者想把job停下來等。一般不知道怎么查詢到
?? job執行的session的sid.
?? 方法一:
?? ??? select * from dba_jobs_running
?? ??? 如果運行比較慢,加
?? ??? select /*+ rule */* from dba_jobs_running
?? 方法二:
?? <1>首先得到job號,從user_jobs或者dba_jobs
?? ??? select * from user_jobs where upper(what) like '%2004PRESENT%'
?? <2> 根據job號查詢sid號
?? ??? select * from v$lock where id2 = 3361910 and type ='JQ'
??????? 就可以查詢到sid了
?? 比如查詢當前的執行什么語句
?? ??? select sql_text from v$sqlarea a,v$lock b,v$session c,user_jobs d
?? ??? where d.upper(what) like '%2004PRESENT%'
?? ??? and d.job = b.id2
?? ??? and b.type='JQ'
?? ??? and b.sid = c.sid
?? ??? and a.hash_value = c.sql_hash_value
?? ??? and a.address = c.sql_address

82.怎么樣給sqlplus安裝幫助
[A]SQLPLUS的幫助必須手工安裝,shell腳本為$ORACLE_HOME/bin/helpins
在安裝之前,必須先設置SYSTEM_PASS環境變量,如:
$ setenv SYSTEM_PASS SYSTEM/MANAGER
$ helpins
如果不設置該環境變量,將在運行腳本的時候提示輸入環境變量
當然,除了shell腳本,還可以利用sql腳本安裝,那就不用設置環境變量了,但是,我們必須以system登錄。
$ sqlplus system/manager
SQL> @?/sqlplus/admin/help/helpbld.sql helpus.sql
安裝之后,你就可以象如下的方法使用幫助了
SQL> help index

83.如何移動數據文件
<1>、關閉數據庫,利用os拷貝
a.shutdown immediate關閉數據庫
b.在os下拷貝數據文件到新的地點
c.Startup mount 啟動到mount下
d.Alter database rename datafile '老文件' to '新文件';
e.Alter database open; 打開數據庫
<2>、利用Rman聯機操作
RMAN> sql "alter database datafile ''file name'' offline";
RMAN> run {
2> copy datafile 'old file location'
3> to 'new file location';
4> switch datafile ' old file location'
5> to datafilecopy ' new file location';
6> }
RMAN> sql "alter database datafile ''file name'' online";
說明:利用OS拷貝也可以聯機操作,不關閉數據庫,與rman的步驟一樣,利用rman與利用os拷貝的原理一樣,在rman中copy是拷貝數據文件,相當于OS的cp,而switch則相當于alter database rename,用來更新控制文件。

84.如何管理聯機日志組與成員
以下是常見操作,如果在OPA/RAC下注意線程號
增加一個日志文件組
Alter database add logfile [group n] '文件全名' size 10M;
在這個組上增加一個成員
Alter database add logfile member '文件全名' to group n;
在這個組上刪除一個日志成員
Alter database drop logfile member '文件全名';
刪除整個日志組
Alter database drop logfile group n;

85.怎么樣計算REDO BLOCK的大小
[A]計算方法為(redo size + redo wastage) / redo blocks written + 16
具體見如下例子
SQL> select name ,value from v$sysstat where name like '%redo%';
NAME VALUE
---------------------------------------------------------------- ----------
redo synch writes 2
redo synch time 0
redo entries 76
redo size 19412
redo buffer allocation retries 0
redo wastage 5884
redo writer latching time 0
redo writes 22
redo blocks written 51
redo write time 0
redo log space requests 0
redo log space wait time 0
redo log switch interrupts 0
redo ordering marks 0
SQL> select (19412+5884)/51 + 16 '"Redo black(byte)" from dual;
Redo black(byte)
------------------
512

86.如果發現表中有壞塊,如何檢索其它未壞的數據
[A]首先需要找到壞塊的ID(可以運行dbverify實現),假設為,假定文件編碼為。運行下面的查詢查找段名:
SELECT segment_name,segment_type,extent_id,block_id, blocks
from dba_extents t
where
file_id =
AND between block_id and (block_id + blocks - 1)
一旦找到壞段名稱,若段是一個表,則最好建立一個臨時表,存放好的數據。若段是索引,則刪除它,再重建。
create table good_table
as
select from bad_table where rowid not in
(select rowid
from bad_table where substr(rowid,10,6) = )
在這里要注意8以前的受限ROWID與現在ROWID的差別。
還可以使用診斷事件10231
SQL> ALTER SYSTEM SET EVENTS '10231 trace name context forever,level 10';
創建一個臨時表good_table的表中除壞塊的數據都檢索出來
SQL>CREATE TABLE good_table as select * from bad_table;
最后關閉診斷事件
SQL> ALTER SYSTEM SET EVENTS '10231 trace name context off ';
關于ROWID的結構,還可以參考dbms_rowid.rowid_create函數

87.怎么樣備份控制文件
在線備份為一個二進制的文件
alter database backup controlfile to '$BACKUP_DEPT/controlfile.000' [reuse];
備份為文本文件方式
alter database backup controlfile to trace [resetlogs|noresetlogs];

88.控制文件損壞如何恢復
<1>、如果是損壞單個控制文件
只需要關閉數據庫,拷貝一個好的數據文件覆蓋掉壞的數據文件即可
或者是修改init.ora文件的相關部分
<2>、如果是損失全部控制文件,則需要創建控制文件或從備份恢復
創建控制文件的腳本可以通過alter database backup controlfile to trace獲取。

89.怎么樣熱備份一個表空間
<1>Alter tablespace 名稱 begin backup;
host cp 這個表空間的數據文件 目的地;
Alter tablespace 名稱 end backup;
如果是備份多個表空間或整個數據庫,只需要一個一個表空間的操作下來就可以了。

90.怎么快速得到整個數據庫的熱備腳本
<1>可以寫一段類似的腳本
SQL>set serveroutput on
begin
dbms_output.enable(10000);
for bk_ts in (select distinct t.ts#,t.name from v$tablespace t,v$datafile d where t.ts#=d.ts#) loop
dbms_output.put_line('--'||bk_ts.name);
dbms_output.put_line('alter tablespace '||bk_ts.name||' begin backup;');
for bk_file in (select file#,name from v$datafile where ts#=bk_ts.ts#) loop
dbms_output.put_line('host cp '||bk_file.name||' $BACKUP_DEPT/');
end loop;
dbms_output.put_line('alter tablespace '||bk_ts.name||' end backup;');
end loop;
end;
/

91.丟失一個數據文件,但是沒有備份,怎么樣打開數據庫
如果沒有備份只能是刪除這個數據文件了,會導致相應的數據丟失。
SQL>startup mount
--ARCHIVELOG模式命令
SQL>Alter database datafile 'file name' offline;
--NOARCHIVELOG模式命令
SQL>Alter database datafile 'file name' offline drop;
SQLl>Alter database open;
注意:該數據文件不能是系統數據文件

92.丟失一個數據文件,沒有備份但是有該數據文件創建以來的歸檔怎么恢復
保證如下條件
a. 不能是系統數據文件
b. 不能丟失控制文件
如果滿足以上條件,則
SQL>startup mount
SQL>Alter database create datafile 'file name' as 'file name' size ... reuse;
SQL>recover datafile n; -文件號
或者
SQL>recover datafile 'file name';
或者
SQL>recover database;
SQL>Alter database open;

93.聯機日志損壞如何恢復
<1>、如果是非當前日志而且歸檔,可以使用
Alter database clear logfile group n來創建一個新的日志文件
如果該日志還沒有歸檔,則需要用
Alter database clear unarchived logfile group n
<2>、如果是當前日志損壞,一般不能clear,則可能意味著丟失數據
如果有備份,可以采用備份進行不完全恢復
如果沒有備份,可能只能用_allow_resetlogs_corruption=true來進行強制恢復了,但是,這樣的方法是不建議的,最好在有Oracle support的指導下進行。

94.怎么樣創建RMAN恢復目錄
首先,創建一個數據庫用戶,一般都是RMAN,并給予recovery_catalog_owner角色權限
sqlplus sys
SQL> create user rman identified by rman;
SQL> alter user rman default tablespace tools temporary tablespace temp;
SQL> alter user rman quota unlimited on tools;
SQL> grant connect, resource, recovery_catalog_owner to rman;
SQL> exit;
然后,用這個用戶登錄,創建恢復目錄
rman catalog rman/rman
RMAN> create catalog tablespace tools;
RMAN> exit;
最后,你可以在恢復目錄注冊目標數據庫了
rman catalog rman/rman target backdba/backdba
RMAN> register database;

95.怎么樣在恢復的時候移動數據文件,恢復到別的地點
給一個RMAN的例子
run {
set until time 'Jul 01 1999 00:05:00';
allocate channel d1 type disk;
set newname for datafile '/u04/oracle/prod/sys1prod.dbf'
to '/u02/oracle/prod/sys1prod.dbf';
set newname for datafile '/u04/oracle/prod/usr1prod.dbf'
to '/u02/oracle/prod/usr1prod.dbf';
set newname for datafile '/u04/oracle/prod/tmp1prod.dbf'
to '/u02/oracle/prod/tmp1prod.dbf';
restore controlfile to '/u02/oracle/prod/ctl1prod.ora';
replicate controlfile from '/u02/oracle/prod/ctl1prod.ora';
restore database;
sql "alter database mount";
switch datafile all;
recover database;
sql "alter database open resetlogs";
release channel d1;
}
96.怎么從備份片(backuppiece)中恢復(restore)控制文件與數據文件
可以使用如下方法,在RMAN中恢復備份片的控制文件
restore controlfile from backuppiecefile;
如果是9i的自動備份,可以采用如下的方法
restore controlfile from autobackup;
但是,如果控制文件全部丟失,需要指定DBID,如SET DBID=?
自動備份控制文件的默認格式是%F,這個格式的形式為
c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII就是DBID
至于恢復(restore)數據文件,oracle 816開始有個包dbms_backup_restore
在 nomount 狀態下就可以執行,可以讀 815甚至之前的備份片,讀出來的文件用于恢復
可以在SQLPLUS中運行,如下
SQL>startup nomount
SQL> DECLARE
2 devtype varchar2(256);
3 done boolean;
4 BEGIN
5 devtype := dbms_backup_restore.deviceallocate('', params=>'');
6 dbms_backup_restore.restoresetdatafile;
7 dbms_backup_restore.restorecontrolfileto('E:/Oracle/oradata/penny/control01.ctl');
8 dbms_backup_restore.restoreDataFileto(1,'E:/Oracle/oradata/penny/system01.dbf');
9 dbms_backup_restore.restoreDataFileto(2,'E:/Oracle/oradata/penny/UNDOTBS01.DBF');
10 dbms_backup_restore.restoreDataFileto(3,'E:/ORACLE/ORADATA/PENNY/USERS01.DBF');
11 dbms_backup_restore.restorebackuppiece('D:/orabak/BACKUP_1_4_04F4IAJT.PENNY',done=>done);
12 END;
13 /
PL/SQL 過程已成功完成。
SQL> alter database mount;
[Q]Rman的format格式中的%s類似的東西代表什么意義
[A]可以參考如下
%c 備份片的拷貝數
%d 數據庫名稱
%D 位于該月中的第幾天 (DD)
%M 位于該年中的第幾月 (MM)
%F 一個基于DBID唯一的名稱,這個格式的形式為c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII為該數據庫的DBID,YYYYMMDD為日期,QQ是一個1-256的序列
%n 數據庫名稱,向右填補到最大八個字符
%u 一個八個字符的名稱代表備份集與創建時間
%p 該備份集中的備份片號,從1開始到創建的文件數
%U 一個唯一的文件名,代表%u_%p_%c
%s 備份集的號
%t 備份集時間戳
%T 年月日格式(YYYYMMDD)

97.執行exec dbms_logmnr_d.build('Logminer.ora','file directory'),提示下標超界,怎么辦
完整錯誤信息如下,
SQL> exec dbms_logmnr_d.build('Logminer.ora','file directory')
BEGIN dbms_logmnr_d.build('Logminer.ora','file directory'); END;
*
ERROR 位于第 1 行:
ORA-06532: 下標超出限制
ORA-06512: 在"SYS.DBMS_LOGMNR_D", line 793
ORA-06512: 在line 1
解決辦法為:
<1>.編輯位于"$ORACLE_HOME/rdbms/admin"目錄下的文件"dbmslmd.sql"
改變行:
TYPE col_desc_array IS VARRAY(513) OF col_description;

TYPE col_desc_array IS VARRAY(700) OF col_description;
并保存文件
<2>. 運行改變后的腳本
SQLPLUS> Connect internal
SQLPLUS> @$ORACLE_HOME/rdbms/admin/dbmslmd.sql
<3>.重新編譯該包
SQLPLUS> alter package DBMS_LOGMNR_D compile body;

98.執行execute dbms_logmnr.start_logmnr(DictFileName=>'DictFileName')提示ORA-01843:無效的月份,這個是什么原因
我們分析start_logmnr包
PROCEDURE start_logmnr(
startScn IN NUMBER default 0 ,
endScn IN NUMBER default 0,
startTime IN DATE default TO_DATE('01-jan-1988','DD-MON-YYYY'),
endTime IN DATE default TO_DATE('01-jan-2988','DD-MON-YYYY'),
DictFileName IN VARCHAR2 default '',
Options IN BINARY_INTEGER default 0 );
可以知道,如果TO_DATE('01-jan-1988','DD-MON-YYYY')失敗,將導致以上錯誤
所以解決辦法可以為
<1>、Alter session set NLS_LANGUAGE=American
<2>、用類似如下的方法執行
execute dbms_logmnr.start_logmnr (DictFileName=> 'f:/temp2/TESTDICT.ora', starttime => TO_DATE(
'01-01-1988','DD-MM-YYYY'), endTime=>TO_DATE('01-01-2988','DD-MM-YYYY'));

99.unix
setenv ORACLE_SID kfcs
sqlplus "/as sysdba"

--========================================================================================================
--========================================== 五.oracle工具使用方面? ======================================
--========================================================================================================
1、oracle? loader
?
?? 控制文件的格式
?? load data
?? infile '數據文件名'
?? into table 表名
?? (first_name position(01:14) char,
??? surname??? position(15:28) char,
??? clssn????? position(29:36) char,
??? hire_data? position(37:42) date 'YYMMDD')
2、sql*plus的copy命令
?? 格式:?? copy from <db> to <db> <opt> <table>
?????????? {(<cols>)}? using <sel>
?? 其中:<db>:database string ;e.g:scott/tiger@oracle

3、在sqlplus快捷方式中,在屬性窗口中,在目標中,在"d:/orawin95/bin/plus33w.exe"
? 后面加空格和"scott/tiger@oracle"即可快速進入

4. SQLPLUS下如何修改編輯器?
DEFINE _EDITOR="<編輯器的完整路經>"? -- 必須加上雙引號
來定義新的編輯器,也可以把這個寫在$ORACLE_HOME/sqlplus/admin/glogin.sql里面使它永久有效。

5、客戶端注冊表修改
?? HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE
??
?? NLS_LANG_BAK? ----語言字符集
?? 簡體中文:SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280
?? 美國英文:AMERICA.WE8ISO8859P1
6、在win95/win98中在注冊表中:
?HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE
?填加一個字符串鍵值
??? local="oracle"? (可根據情況而定,指數據庫別名)
??? 即可以在sql*plus中不用輸入連接串
??? 或在autoexec.bat 中添加"set local=alias_name"

5. EXP 如何加query參數?
EXP USER/PASS FILE=A.DMP TABLES(BSEMPMS)
QUERY='"WHERE EMP_NO=/'S09394/'/";

6、IMP 如何導處DDL語句
imp aicbs/aicbs@busi_cs file=okcai.dmp rows=n indexfile=k.sql

7.不同版本怎么導出/導入
導出用低版本,導入用當前版本
如果版本跨越太大,需要用到中間版本過渡

8.不同的字符集之前怎么導數據
a.前條件是保證導出/導入符合其他字符集標準,如客戶環境與數據庫字符集一致。
b.修改dmp文件的2、3字節為目標數據庫的字符集,注意要換成十六進制。
參考函數(以下函數中的ID是十進制的):
nls_charset_name 根據字符集ID獲得字符集名稱
nls_charset_id 根據字符集名稱獲得字符集ID

9.在sql*plus中可以用&替代sql語句的變量,同樣,也可以替換實體名稱。比如表名。
目前有acc_bill_570,acc_bill_571,....acc_bill_580 等11張表。如果根據情況查詢不同的表,可以如下執行。
SQL> select * from acc_bill_&region_code where rownum<=10;

或者
SQL> define region_code=579
SQL> select * from acc_bill_&region_code where rownum<=10;

--========================================================================================================
--========================================== 六.oracle優化方面????? ======================================
--========================================================================================================
1. 查詢正在執行語句的執行計劃(也就是實際語句執行計劃)
??? select * from v$sql_plan where hash_value = (select sql_hash_value from v$session where sid = 1111);
??? 其中id和parent_id表示了執行數的結構,數值最大的為最先執行
??? 比如
ID? PARENT_ID???
-------------???
0???
1??? 0
2??? 1
3??? 2
4??? 3
5??? 4
6??? 3???
------------則執行計劃樹為
????????????? 0
????????????? 1
????????????? 2
????????????? 3
?????????? 6???? 4?
????????????????? 5


2.如何設置自動跟蹤
用system登錄
執行$ORACLE_HOME/rdbms/admin/utlxplan.sql創建計劃表
執行$ORACLE_HOME/sqlplus/admin/plustrce.sql創建plustrace角色
如果想計劃表讓每個用戶都能使用,則
SQL>create public synonym plan_table for plan_table;
SQL> grant all on plan_table to public;
如果想讓自動跟蹤的角色讓每個用戶都能使用,則
SQL> grant plustrace to public;
通過如下語句開啟/停止跟蹤
SET AUTOTRACE ON |OFF
| ON EXPLAIN | ON STATISTICS | TRACEONLY | TRACEONLY EXPLAIN

3.如何跟蹤自己的會話或者是別人的會話
跟蹤自己的會話很簡單
Alter session set sql_trace true|false
Or
Exec dbms_session.set_sql_trace(TRUE);
如果跟蹤別人的會話,需要調用一個包
exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false)
跟蹤的信息在user_dump_dest 目錄下可以找到或通過如下腳本獲得文件名稱(適用于Win環境,如果是unix需要做一定修改)
SELECT p1.value||'/'||p2.value||'_ora_'||p.spid||'.ora' filename
FROM
v$process p,
v$session s,
v$parameter p1,
v$parameter p2
WHERE p1.name = 'user_dump_dest'
AND p2.name = 'db_name'
AND p.addr = s.paddr
AND s.audsid = USERENV ('SESSIONID')
最后,可以通過Tkprof來解析跟蹤文件,如
Tkprof 原文件 目標文件 sys=n

4.怎么設置整個數據庫系統跟蹤
其實文檔上的alter system set sql_trace=true是不成功的
但是可以通過設置事件來完成這個工作,作用相等
alter system set events
'10046 trace name context forever,level 1';
如果關閉跟蹤,可以用如下語句
alter system set events
'10046 trace name context off';
其中的level 1與上面的8都是跟蹤級別
level 1:跟蹤SQL語句,等于sql_trace=true
level 4:包括變量的詳細信息
level 8:包括等待事件
level 12:包括綁定變量與等待事件


5.怎么樣根據OS進程快速獲得DB進程信息與正在執行的語句
有些時候,我們在OS上操作,象TOP之后我們得到的OS進程,怎么快速根據OS信息獲得DB信息呢?
我們可以編寫如下腳本:
$more whoit.sh
#!/bin/sh
sqlplus /nolog 100,cascade=> TRUE);
dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);
這是對命令與工具包的一些總結
<1>、對于分區表,建議使用DBMS_STATS,而不是使用Analyze語句。
a) 可以并行進行,對多個用戶,多個Table
b) 可以得到整個分區表的數據和單個分區的數據。
c) 可以在不同級別上Compute Statistics:單個分區,子分區,全表,所有分區
d) 可以倒出統計信息
e) 可以用戶自動收集統計信息
<2>、DBMS_STATS的缺點
a) 不能Validate Structure
b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,這兩個仍舊需要使用Analyze語句。
c) DBMS_STATS 默認不對索引進行Analyze,因為默認Cascade是False,需要手工指定為True
<3>、對于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS來收集信息。

6.怎么樣快速重整索引
通過rebuild語句,可以快速重整或移動索引到別的表空間
rebuild有重建整個索引數的功能,可以在不刪除原始索引的情況下改變索引的存儲參數
語法為
alter index index_name rebuild tablespace ts_name
storage(......);
如果要快速重建整個用戶下的索引,可以用如下腳本,當然,需要根據你自己的情況做相應修改
SQL> set heading off
SQL> set feedback off
SQL> spool d:/index.sql
SQL> SELECT 'alter index ' || index_name || ' rebuild '
||'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);'
FROM all_indexes
WHERE ( tablespace_name != 'INDEXES'
OR next_extent != ( 256 * 1024 )
)
AND owner = USER
SQL>spool off
另外一個合并索引的語句是
alter index index_name coalesce,這個語句僅僅是合并索引中同一級的leaf block
消耗不大,對于有些索引中存在大量空間浪費的情況下,有一些作用。

7.如何使用Hint提示
在select/delete/update后寫/*+ hint */
如 select /*+ index(TABLE_NAME INDEX_NAME) */ col1...
注意/*和+之間不能有空格
如用hint指定使用某個索引
select /*+ index(cbotab) */ col1 from cbotab;
select /*+ index(cbotab cbotab1) */ col1 from cbotab;
select /*+ index(a cbotab1) */ col1 from cbotab a;
其中
TABLE_NAME是必須要寫的,且如果在查詢中使用了表的別名,在hint也要用表的別名來代替表名;
INDEX_NAME可以不必寫,Oracle會根據統計值選一個索引;
如果索引名或表名寫錯了,那這個hint就會被忽略;

8.怎么樣快速復制表或者是插入數據
快速復制表可以指定Nologging選項
如:Create table t1 nologging
as select * from t2;
快速插入數據可以指定append提示,但是需要注意
noarchivelog模式下,默認用了append就是nologging模式的。
在archivelog下,需要把表設置程Nologging模式。
如insert /*+ append */ into t1
select * from t2
注意:如果在9i環境中并設置了FORCE LOGGING,則以上操作是無效的,并不會加快,當然,可以通過如下語句設置為NO FORCE LOGGING。
Alter database no force logging;
是否開啟了FORCE LOGGING,可以用如下語句查看
SQL> select force_logging from v$database;

9.怎么避免使用特定索引
在很多時候,Oracle會錯誤的使用索引而導致效率的明顯下降,我們可以使用一點點技巧而避免使用不該使用的索引,如:
表test,有字段a,b,c,d,在a,b,c上建立聯合索引inx_a(a,b,c),在b上單獨建立了一個索引Inx_b(b)。
在正常情況下,where a=? and b=? and c=?會用到索引inx_a,
where b=?會用到索引inx_b
但是,where a=? and b=? and c=? group by b會用到哪個索引呢?在分析數據不正確(很長時間沒有分析)或根本沒有分析數據的情況下,oracle往往會使用索引inx_b。通過執行計劃的分析,這個索引的使用,將大大耗費查詢時間。
當然,我們可以通過如下的技巧避免使用inx_b,而使用inx_a。
where a=? and b=? and c=? group by b||'' --如果b是字符
where a=? and b=? and c=? group by b+0 --如果b是數字
通過這樣簡單的改變,往往可以是查詢時間提交很多倍
當然,我們也可以使用no_index提示,相信很多人沒有用過,也是一個不錯的方法:
select /*+ no_index(t,inx_b) */ * from test t
where a=? and b=? and c=? group by b

舉例:
本來在CM_USER上有索引IDX_CM_USER4(ACC_ID)和IDX_CM_USER8(BILL_ID),可是執行如下語句的時候很慢。
select * from CM_USER where? acc_id =1200007175
and user_status>0 and bill_id like '13%' order by acc_id,bill_id
用explain分析,發現執行計劃是用IDX_CM_USER8.如下查詢
select * from user_indexes where table_name ='CM_USER' 發現IDX_CM_USER8沒有分析過。
用下面語句執行計劃改變
select /*+INDEX(CM_USER IDX_CM_USER4)*/*
from CM_USER where? acc_id =1200007175 and user_status>0 and bill_id like '13%' order by acc_id,bill_id

或者分析索引
exec dbms_stats.gather_index_stats(ownname => 'QACS1',indname => 'IDX_CM_USER8',estimate_percent => 5 );
可以發現執行計劃恢復正常。


10.Oracle什么時候會使用跳躍式索引掃描
這是9i的一個新特性跳躍式索引掃描(Index Skip Scan).
例如表有索引index(a,b,c),當查詢條件為
where b=?的時候,可能會使用到索引index(a,b,c)
如,執行計劃中出現如下計劃:
INDEX (SKIP SCAN) OF 'TEST_IDX' (NON-UNIQUE)
Oracle的優化器(這里指的是CBO)能對查詢應用Index Skip Scans至少要有幾個條件:
<1> 優化器認為是合適的。
<2> 索引中的前導列的唯一值的數量能滿足一定的條件(如重復值很多)。
<3> 優化器要知道前導列的值分布(通過分析/統計表得到)。
<4> 合適的SQL語句
等。


11.怎么樣創建使用虛擬索引
可以使用nosegment選項,如
create index virtual_index_name on table_name(col_name) nosegment;
如果在哪個session需要測試虛擬索引,可以利用隱含參數來處理
alter session set "_use_nosegment_indexes" = true;
就可以利用explain plan for select ……來看虛擬索引的效果
利用@$ORACLE_HOME/rdbms/admin/utlxpls查看執行計劃
最后,根據需要,我們可以刪除虛擬索引,如普通索引一樣
drop index virtual_index_name;
注意:虛擬索引并不是物理存在的,所以虛擬索引并不等同于物理索引,不要用自動跟蹤去測試虛擬索引,因為那是實際執行的效果,是用不到虛擬索引的。

12.怎樣監控無用的索引
Oracle 9i以上,可以監控索引的使用情況,如果一段時間內沒有使用的索引,一般就是無用的索引
語法為:
開始監控:alter index index_name monitoring usage;
檢查使用狀態:select * from v$object_usage;
停止監控:alter index index_name nomonitoring usage;
當然,如果想監控整個用戶下的索引,可以采用如下的腳本:
set heading off
set echo off
set feedback off
set pages 10000
spool start_index_monitor.sql
SELECT 'alter index '||owner||'.'||index_name||' monitoring usage;'
FROM dba_indexes
WHERE owner = USER;
spool off
set heading on
set echo on
set feedback on
------------------------------------------------
set heading off
set echo off
set feedback off
set pages 10000
spool stop_index_monitor.sql
SELECT 'alter index '||owner||'.'||index_name||' nomonitoring usage;'
FROM dba_indexes
WHERE owner = USER;
spool off
set heading on
set echo on
set feedback on

13.怎么樣能固定我的執行計劃
可以使用OUTLINE來固定SQL語句的執行計劃
用如下語句可以創建一個OUTLINE
Create oe replace outline OutLn_Name on
Select Col1,Col2 from Table
where .......
如果要刪除Outline,可以采用
Drop Outline OutLn_Name;
對于已經創建了的OutLine,存放在OUTLN用戶的OL$HINTS表下面
對于有些語句,你可以使用update outln.ol$hints來更新outline
如update outln.ol$hints(ol_name,'TEST1','TEST2','TEST2','TEST1)
where ol_name in ('TEST1','TEST2');
這樣,你就把Test1 OUTLINE與Test2 OUTLINE互換了
如果想利用已經存在的OUTLINE,需要設置以下參數
Alter system/session set Query_rewrite_enabled = true
Alter system/session set use_stored_outlines = true

14.v$sysstat中的class分別代表什么
統計類別
1 代表事例活動
2 代表Redo buffer活動
4 代表鎖
8 代表數據緩沖活動
16 代表OS活動
32 代表并行活動
64 代表表訪問
128 代表調試信息

15.怎么殺掉特定的數據庫會話
Alter system kill session 'sid,serial#';
或者
alter system disconnect session 'sid,serial#' immediate;
在win上,還可以采用oracle提供的orakill殺掉一個線程(其實就是一個Oracle進程)
在Linux/Unix上,可以直接利用kill殺掉數據庫進程對應的OS進程

16.怎么快速查找鎖與鎖等待
數據庫的鎖是比較耗費資源的,特別是發生鎖等待的時候,我們必須找到發生等待的鎖,有可能的話,殺掉該進程。
這個語句將查找到數據庫中所有的DML語句產生的鎖,還可以發現,任何DML語句其實產生了兩個鎖,一個是表鎖,一個是行鎖。
可以通過alter system kill session ‘sid,serial#’來殺掉會話
SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
如果發生了鎖等待,我們可能更想知道是誰鎖了表而引起誰的等待
以下的語句可以查詢到誰鎖了表,而誰在等待。
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC
以上查詢結果是一個樹狀結構,如果有子節點,則表示有等待發生。如果想知道鎖用了哪個回滾段,還可以關聯到V$rollname,其中xidusn就是回滾段的USN
[Q] 如何有效的刪除一個大表(extent數很多的表)
[A] 一個有很多(100k)extent的表,如果只是簡單地用drop table的話,會很大量消耗CPU(Oracle要對fet$、uet$數據字典進行操作),可能會用上幾天的時間,較好的方法是分多次刪除extent,以減輕這種消耗:
1. truncate table big-table reuse storage;
2. alter table big-table deallocate unused keep 2000m ( 原來大小的n-1/n);
3. alter table big-table deallocate unused keep 1500m ;
....
4. drop table big-table;

17.如何收縮臨時數據文件的大小
9i以下版本采用
ALTER DATABASE DATAFILE 'file name' RESIZE 100M類似的語句
9i以上版本采用
ALTER DATABASE TEMPFILE 'file name' RESIZE 100M
注意,臨時數據文件在使用時,一般不能收縮,除非關閉數據庫或斷開所有會話,停止對臨時數據文件的使用。

18.怎么清理臨時段
可以使用如下辦法
<1>、 使用如下語句查看一下認誰在用臨時段
SELECT username,sid,serial#,sql_address,machine,program,
tablespace,segtype, contents
FROM v$session se,v$sort_usage su
WHERE se.saddr=su.session_addr
<2>、 那些正在使用臨時段的進程
SQL>Alter system kill session 'sid,serial#';
<3>、把TEMP表空間回縮一下
SQL>Alter tablespace TEMP coalesce;
還可以使用診斷事件
<1>、 確定TEMP表空間的ts#
SQL> select ts#, name FROM v$tablespace;
TS# NAME
-----------------------
0 SYSYEM
1 RBS
2 USERS
3* TEMP
...
<2>、 執行清理操作
alter session set events 'immediate trace name DROP_SEGMENTS level TS#+1'
說明:
temp表空間的TS# 為 3*, So TS#+ 1= 4
如果想清除所有表空間的臨時段,則
TS# = 2147483647

19.怎么樣dump數據庫內部結構,如上面顯示的控制文件的結構
[A]常見的有
1、分析數據文件塊,轉儲數據文件n的塊m
alter system dump datafile n block m
2、分析日志文件
alter system dump logfile logfilename;
3、分析控制文件的內容
alter session set events 'immediate trace name CONTROLF level 10'
4、分析所有數據文件頭
alter session set events 'immediate trace name FILE_HDRS level 10'
5、分析日志文件頭
alter session set events 'immediate trace name REDOHDR level 10'
6、分析系統狀態,最好每10分鐘一次,做三次對比
alter session set events 'immediate trace name SYSTEMSTATE level 10'
7、分析進程狀態
alter session set events 'immediate trace name PROCESSSTATE level 10'
8、分析Library Cache的詳細情況
alter session set events 'immediate trace name library_cache level 10'


20.如何獲得所有的事件代碼
事件代碼范圍一般從10000 to 10999,以下列出了這個范圍的事件代碼與信息
SET SERVEROUTPUT ON
DECLARE
err_msg VARCHAR2(120);
BEGIN
dbms_output.enable (1000000);
FOR err_num IN 10000..10999
LOOP
err_msg := SQLERRM (-err_num);
IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN
dbms_output.put_line (err_msg);
END IF;
END LOOP;
END;
/
在Unix系統上,事件信息放在一個文本文件里
$ORACLE_HOME/rdbms/mesg/oraus.msg
可以用如下腳本查看事件信息
event=10000
while [ $event -ne 10999 ]
do
event=`expr $event + 1`
oerr ora $event
done
對于已經確保的/正在跟蹤的事件,可以用如下腳本獲得
SET SERVEROUTPUT ON
DECLARE
l_level NUMBER;
BEGIN
FOR l_event IN 10000..10999
LOOP
dbms_system.read_ev (l_event,l_level);
IF l_level > 0 THEN
dbms_output.put_line ('Event '||TO_CHAR (l_event)||
' is set at level '||TO_CHAR (l_level));
END IF;
END LOOP;
END;
/

21.什么是STATSPACK,我怎么使用它?
Statspack是Oracle 8i以上提供的一個非常好的性能監控與診斷工具,基本上全部包含了BSTAT/ESTAT的功能,更多的信息
可以參考附帶文檔$ORACLE_HOME/rdbms/admin/spdoc.txt。
安裝Statspack:
cd $ORACLE_HOME/rdbms/admin
sqlplus "/ as sysdba" @spdrop.sql -- 卸載,第一次可以不需要
sqlplus "/ as sysdba" @spcreate.sql -- 需要根據提示輸入表空間名
使用Statspack:
sqlplus perfstat/perfstat
exec statspack.snap; -- 進行信息收集統計,每次運行都將產生一個快照號
-- 獲得快照號,必須要有兩個以上的快照,才能生成報表
select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT;
@spreport.sql -- 輸入需要查看的開始快照號與結束快照號
其他相關腳本s:
spauto.sql - 利用dbms_job提交一個作業,自動的進行STATPACK的信息收集統計
sppurge.sql - 清除一段范圍內的統計信息,需要提供開始快照與結束快照號
sptrunc.sql - 清除(truncate)所有統計信息


22. SQL語句的優化方法
??? <1> /*+ALL_ROWS*/
?? 表明對語句塊選擇基于開銷的優化方法,并獲得最佳吞吐量,使資源消耗最小化.
?? 例如:
?? SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';

??? <2>. /*+FIRST_ROWS*/
?? 表明對語句塊選擇基于開銷的優化方法,并獲得最佳響應時間,使資源消耗最小化.
?? 例如:
?? SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE??? EMP_NO='CCBZZP';

??? <3>. /*+CHOOSE*/
?? 表明如果數據字典中有訪問表的統計信息,將基于開銷的優化方法,并獲得最佳的吞吐量;
?? 表明如果數據字典中沒有訪問表的統計信息,將基于規則開銷的優化方法;
?? 例如:
?? SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';

??? <4>. /*+RULE*/
?? 表明對語句塊選擇基于規則的優化方法.
?? 例如:
?? SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';??

??? <5>. /*+FULL(TABLE)*/
?? 表明對表選擇全局掃描的方法.
?? 例如:
?? SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='CCBZZP';

??? <6>. /*+ROWID(TABLE)*/
?? 提示明確表明對指定表根據ROWID進行訪問.
?? 例如:
?? SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'
?? AND EMP_NO='CCBZZP';

??? <7>. /*+CLUSTER(TABLE)*/
?? 提示明確表明對指定表選擇簇掃描的訪問方法,它只對簇對象有效.
?? 例如:
?? SELECT? /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
?? WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

??? <8>. /*+INDEX(TABLE INDEX_NAME)*/
?? 表明對表選擇索引的掃描方法.
?? 例如:
?? SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE??? BSEMPMS */? FROM BSEMPMS WHERE SEX='M';

??? <9>. /*+INDEX_ASC(TABLE INDEX_NAME)*/
?? 表明對表選擇索引升序的掃描方法.
?? 例如:
?? SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */? FROM BSEMPMS WHERE DPT_NO='CCBZZP';

??? <10>. /*+INDEX_COMBINE*/
?? 為指定表選擇位圖訪問路經,如果INDEX_COMBINE中沒有提供作為參數的索引,將選擇出位圖索引的
?? 布爾組合方式.
?? 例如:
?? SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS
?? WHERE SAL<5000000 AND HIREDATE<SYSDATE;

??? <11>. /*+INDEX_JOIN(TABLE INDEX_NAME)*/
?? 提示明確命令優化器使用索引作為訪問路徑.
?? 例如:
?? SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE
?? FROM BSEMPMS WHERE SAL<60000;

??? <12>. /*+INDEX_DESC(TABLE INDEX_NAME)*/
?? 表明對表選擇索引降序的掃描方法.
?? 例如:
?? SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */? FROM BSEMPMS WHERE??? DPT_NO='CCBZZP';

??? <13>. /*+INDEX_FFS(TABLE INDEX_NAME)*/
?? 對指定的表執行快速全索引掃描,而不是全表掃描的辦法.
?? 例如:
?? SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305';

??? <14>. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/
?? 提示明確進行執行規劃的選擇,將幾個單列索引的掃描合起來.
?? 例如:
?? SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='CCBZZP' AND DPT_NO='TDC306';

??? <15>. /*+USE_CONCAT*/
?? 對查詢中的WHERE后面的OR條件進行轉換為UNION ALL的組合查詢.
?? 例如:
?? SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';

??? <16>. /*+NO_EXPAND*/
?? 對于WHERE后面的OR 或者IN-LIST的查詢語句,NO_EXPAND將阻止其基于優化器對其進行擴展.
?? 例如:
?? SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE? DPT_NO='TDC506' AND SEX='M';

??? <17>. /*+NOWRITE*/
?? 禁止對查詢塊的查詢重寫操作.

??? <18>. /*+REWRITE*/
?? 可以將視圖作為參數.

??? <19>. /*+MERGE(TABLE)*/
?? 能夠對視圖的各個查詢進行相應的合并.
?? 例如:
?? SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO
?? ,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO
?? AND A.SAL>V.AVG_SAL;

??? <20>. /*+NO_MERGE(TABLE)*/
?? 對于有可合并的視圖不再合并.
?? 例如:
?? SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO
?? ,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO
?? AND A.SAL>V.AVG_SAL;
??
??? <21>. /*+ORDERED*/
?? 根據表出現在FROM中的順序,ORDERED使ORACLE依此順序對其連接.
?? 例如:
?? SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C
?? WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;

??? <22>. /*+USE_NL(TABLE)*/
?? 將指定表與嵌套的連接的行源進行連接,并把指定表作為內部表.
?? 例如:
?? SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

??? <23>. /*+USE_MERGE(TABLE)*/
?? 將指定的表與其他行源通過合并排序連接方式連接起來.
?? 例如:
?? SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE
?? BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

??? <24>. /*+USE_HASH(TABLE)*/
?? 將指定的表與其他行源通過哈希連接方式連接起來.
?? 例如:
?? SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE
?? BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

??? <25>. /*+DRIVING_SITE(TABLE)*/
?? 強制與ORACLE所選擇的位置不同的表進行查詢執行.
?? 例如:
?? SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;

??? <26>. /*+LEADING(TABLE)*/
?? 將指定的表作為連接次序中的首表.
??
??? <27>. /*+CACHE(TABLE)*/
?? 當進行全表掃描時,CACHE提示能夠將表的檢索塊放置在緩沖區緩存中最近最少列表LRU的最近使用端
?? 例如:
?? SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM? BSEMPMS;

??? <28>. /*+NOCACHE(TABLE)*/
?? 當進行全表掃描時,CACHE提示能夠將表的檢索塊放置在緩沖區緩存中最近最少列表LRU的最近使用端
?? 例如:
?? SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM? BSEMPMS;

??? <29>. /*+APPEND*/
?? 直接插入到表的最后,可以提高速度.
?? insert /*+append*/ into test1? select * from test4 ;
??
? insert /*+append */ into emp nologging

??? <30>. /*+NOAPPEND*/
?? 通過在插入語句生存期內停止并行模式來啟動常規插入.

?? insert /*+noappend*/ into test1? select * from test4 ;
??? <31>.parallel direct-load insert
??? ??? sql> alter session enable parallel dml;
??? ??? sql> insert /*+parallel(emp,2) */ into emp nologging
??? ??? sql> select * from emp_old;

--========================================================================================================
--========================================== 七.其他??????????????? ======================================
--========================================================================================================????????????????? ??? ???

1.如何限定特定IP訪問數據庫
可以利用登錄觸發器、cmgw或者是在$OREACLE_HOME/network/admin下新增一個protocol.ora文件(有些os可能是. protocol.ora),9i可以直接修改sqlnet.ora:
增加如下內容:
tcp.validnode_checking=yes
#允許訪問的ip
tcp.inited_nodes=(ip1,ip2,...)
#不允許訪問的ip
tcp.excluded_nodes=(ip1,ip2,...)


2.如何穿過防火墻連接數據庫
這個問題只會在WIN平臺出現,UNIX平臺會自動解決。
解決方法:
在服務器端的SQLNET.ORA應類似
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
TRACE_LEVEL_CLIENT = 16
注冊表的HOME0加[HKEY_LOCAL_MACHINE]
USE_SHARED_SOCKET=TRUE


3.如何利用hostname方式連接數據庫
host name方式只支持tcp/ip協議的小局域網
修改listener.ora中的如下信息
(SID_DESC =
(GLOBAL_DBNAME = ur_hostname) --你的機器名
(ORACLE_HOME = E:/oracle/ora92) --oracle home
(SID_NAME = orcl) --sid name
)
然后在客戶端
的sqlnet.ora中,確保有
NAMES.DIRECTORY_PATH= (HOSTNAME)
你就可以利用數據庫服務器的名稱訪問數據庫了


4.dbms_repcat_admin能帶來什么安全隱患
如果一個用戶能執行dbms_repcat_admin包,將獲得極大的系統權限。
以下情況可能獲得該包的執行權限:
1、在sys下grant execute on dbms_repcat_admin to public[|user_name]
2、用戶擁有execute any procedure特權(僅限于9i以下,9i必須顯示授權)
如果用戶通過執行如下語句:
exec sys.dbms_repcat_admin.grant_admin_any_schema('user_name');
該用戶將獲得極大的系統特權
可以從user_sys_privs中獲得詳細信息

5.在不知道用戶密碼的時候,怎么樣跳轉到另外一個用戶執行操作后并不影響該用戶?
我們通過如下的方法,可以安全使用該用戶,然后再跳轉回來,在某些時候比較有用
需要Alter user權限或DBA權限:
SQL> select password from dba_users where username='SCOTT';
PASSWORD
-----------------------------
F894844C34402B67
SQL> alter user scott identified by lion;
User altered.
SQL> connect scott/lion
Connected.
REM Do whatever you like...
SQL> connect system/manager
Connected.
SQL> alter user scott identified by values 'F894844C34402B67';
User altered.
SQL> connect scott/tiger
Connected.


6.如何加固你的數據庫
要注意以下方面
1. 修改sys, system的口令。
2. Lock,修改,刪除默認用戶: dbsnmp,ctxsys等。
3. 把REMOTE_OS_AUTHENT改成False,防止遠程機器直接登陸。
4. 把O7_DICTIONARY_ACCESSIBILITY改成False。
5. 把一些權限從PUBLIC Role取消掉。
6. 檢查數據庫的數據文件的安全性。不要設置成666之類的。檢查其他dba 用戶。
7. 把一些不需要的服務(比如ftp, nfs等關閉掉)
8. 限制數據庫主機上面的用戶數量。
9. 定期檢查Metalink/OTN上面的security Alert。比如:
http://otn.oracle.com/deploy/security/alerts.htm

10. 把你的數據庫與應用放在一個單獨的子網中,要不然你的用戶密碼很容易被sniffer去。或者采用advance security,對用戶登錄加密。
11. 限止只有某些ip才能訪問你的數據庫。
12. lsnrctl 要加密碼,要不然別人很容易從外面關掉你的listener。
13. 如果可能,不要使用默認1521端口


7.如何檢查用戶是否用了默認密碼
如果使用默認密碼,很可能就對你的數據庫造成一定的安全隱患,那么可以使用如下的查詢獲得那些用戶使用默認密碼
select username "User(s) with Default Password!"
from dba_users
where password in
('E066D214D5421CCC', -- dbsnmp
'24ABAB8B06281B4C', -- ctxsys
'72979A94BAD2AF80', -- mdsys
'C252E8FA117AF049', -- odm
'A7A32CD03D3CE8D5', -- odm_mtr
'88A2B2C183431F00', -- ordplugins
'7EFA02EC7EA6B86F', -- ordsys
'4A3BA55E08595C81', -- outln
'F894844C34402B67', -- scott
'3F9FBD883D787341', -- wk_proxy
'79DF7A1BD138CF11', -- wk_sys
'7C9BA362F8314299', -- wmsys
'88D8364765FCE6AF', -- xdb
'F9DA8977092B7B81', -- tracesvr
'9300C0977D7DC75E', -- oas_public
'A97282CE3D94E29E', -- websys
'AC9700FD3F1410EB', -- lbacsys
'E7B5D92911C831E1', -- rman
'AC98877DE1297365', -- perfstat
'66F4EF5650C20355', -- exfsys
'84B8CBCA4D477FA3', -- si_informtn_schema
'D4C5016086B2DC6A', -- sys
'D4DF7931AB130E37') -- system
/


8.如何修改默認的XDB監聽端口

Oracle9i默認的XML DB把HTTP的默認端口設為8080,這是一個太常用的端口了,很多別的WebServer都會使用這個端口,
如果我們安裝了它,最好修改一下,避免沖突,如果不使用呢,就最好不要安裝
提供三種修改的方法
1.dbca,選擇你的數據庫,然后Standard Database Features->Customize->Oracle XML DB option,進入這個畫面你應該就知道怎么改了。
2.OEM console,在XML Database 的配置里面修改
3.用oracle提供的包:
-- 把HTTP/WEBDAV端口從8080改到8081
SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),
'/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',8081))
/
-- 把FTP端口從2100改到2111
SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),
'/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()',2111))
/
SQL> commit;
SQL> exec dbms_xdb.cfg_refresh;
-- 檢查修改是否已經成功
SQL> select dbms_xdb.cfg_get from dual;


9.怎么捕獲用戶登錄信息,如SID,IP地址等
可以利用登錄觸發器,如
CREATE OR REPLACE TRIGGER tr_login_record
AFTER logon ON DATABASE
DECLARE
miUserSid NUMBER;
mtSession v$session%ROWTYPE;
CURSOR cSession(iiUserSid IN NUMBER) IS
SELECT * FROM v$session
WHERE sid=iiUserSid;
BEGIN
SELECT sid INTO miUserSid FROM v$mystat WHERE rownum

10.程序報錯
ORA-01555: snapshot too old: rollback segment number 148 with name "_SYSSMU148$" too small
可以查詢錯誤原因
oerr ora 01555
得到如下信息
01555, 00000, "snapshot too old: rollback segment number %s with name /"%s/" too small"
// *Cause: rollback records needed by a reader for consistent read are
//???????? overwritten by other writers
// *Action: If in Automatic Undo Management mode, increase undo_retention
//????????? setting. Otherwise, use larger rollback segments

說明一個事務的執行時長超過了系統設定的最大值.
SQL> show parameters undo
比如
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ------------------------------
undo_management????????????????????? string????? AUTO
undo_retention?????????????????????? integer???? 16200
undo_suppress_errors???????????????? boolean???? FALSE
undo_tablespace????????????????????? string????? UNDOTBS2

則說明是16200秒.

11.如果你要用ultraEdit-32編輯oracle腳本,可以設置對關鍵字不同亮度的顯示。點"advanced"-->"configuration"-->"Syntax Highlighting"
-->"open",然后把下面的代碼追加到最后保存,再重新打開ultraEdit,編輯.sql文件就可以看到了。這樣顏色上容易分辨。方便一些。

/L8"sql" Nocase Line Comment = -- Block Comment On = /* Block Comment Off = */ String Chars = ' File Extensions = SQL
/Delimiters = ~!%@^&*()-+=|//{}[]:;"'<> ,??? .?
/Function String = "%[A-Z _]*[~/s]+(*)"
/C1 "Keywords"
ABORT ACCEPT ACCESS ADD ALL ALTER AND ANY ARRAY ARRAYLEN AS ASC ASSERT ASSIGN AT AUDIT AUTHORIZATION AVG
BASE_TABLE BEGIN BETWEEN BINARY_INTEGER BODY BOOLEAN BY
CASE CHAR CHAR_BASE CHECK CLOSE CLUSTER CLUSTERS COLAUTH COLUMN COMMENT COMMIT COMPRESS CONNECT CONSTANT CRASH CREATE CURRENT CURRVAL CURSOR
DATABASE DATA_BASE DATE DBA DEBUGOFF DEBUGON DECLARE DECIMAL DEFAULT DEFINITION DELAY DELETE DESC DIGITS DISPOSE DISTINCT DO DROP
ELSE ELSIF END ENTRY EXCEPTION EXCEPTION_INIT EXCLUSIVE EXISTS EXIT
FALSE FETCH FILE FLOAT FOR FORM FROM FUNCTION
GENERIC GOTO GRANT GROUP
HAVING
IDENTIFIED IF IMMEDIATE IN INCREMENT INDEX INDEXES INDICATOR INITIAL INSERT INTEGER INTERFACE INTERSECT INTO IS
LEVEL LIKE LIMITED LOCK LONG LOOP
MAX MAXEXTENTS MIN MINEXTENTS MINUS MISLABEL MOD MODE
NATURAL NATURALN NEW NEXTVAL NOAUDIT NOCOMPRESS NOLOGGING NOT NOWAIT NULL NUMBER NUMBER_BASE
OF OFFLINE ON ONLINE OPEN OPTION OR ORDER OTHERS OUT
PACKAGE PARTITION PCTFREE PCTUSED PLS_INTEGER POSITIVE POSITIVEN PRAGMA PRIOR PRIVATE PRIVILEGES PROCEDURE PUBLIC
RAISE RANGE RAW REAL RECORD REF RELEASE REMR RENAME RESOURCE RETURN REVERSE REVOKE ROLLBACK ROW ROWID ROWLABEL ROWNUM ROWS ROWTYPE RUN
SAVEPOINT SCHEMA SELECT SEPARATE SESSION SET SHARE SMALLINT SPACE SQL SQLCODE SQLERRM START STATEMENT STDDEV SUBTYPE SUCCESSFUL SUM SYNONYM SYSDATE
TABAUTH TABLE TABLES TASK TERMINATE THEN TO TRIGGER TRUE TYPE
UID UNION UNIQUE UPDATE USE USER
VALIDATE VALUES VARCHAR VARCHAR2 VARIANCE VIEW VIEWS
WHEN WHENEVER WHERE WHILE WITH WORK WRITE
XOR
/C2 "Packages"
DBMS_OUTPUT
DBMS_JOB
DBMS_SQL
/C3 "Package Methods"
BIND_VARIABLE BIND_VARIABLE_CHAR BIND_VARIABLE_RAW BIND_VARIABLE_ROWID BROKEN
CHANGE CLOSE_CURSOR COLUMN_VALUE COLUMN_VALUE_CHAR COLUMN_VALUE_RAW COLUMN_VALUE_ROWID
DEFINE_COLUMN DEFINE_COLUMN_CHAR DEFINE_COLUMN_RAW DEFINE_COLUMN_ROWID DISABLE
ENABLE EXECUTE EXECUTE_AND_FETCH
FETCH_ROWS
GET_LINE GET_LINES
INTERVAL IS_OPEN
LAST_ERROR_POSITION LAST_ROW_COUNT LAST_ROW_ID LAST_SQL_FUNCTION_CODE
NEW_LINE NEXT_DATE
OPEN_CURSOR
PARSE PUT PUT_LINE
REMOVE
SUBMIT
WHAT
/C4 "SQL*Plus Commands"
EXECUTE
GRANT
REPLACE
RUN
START
/C5 "SQL*Plus Functions"
ABS ADD_MONTHS ASCII
CEIL CHR CONCAT CONVERT COS COSH
DECODE
EXP
FLOOR
GREATEST
HEXTORAW
INITCAP INSTR
LAST_DAY LENGTH LN LOG LOWER LPAD LTRIM
MOD MONTHS_BETWEEN
NEXT_DAY NEW_TIME NLS_INITCAP NLS_LOWER NLS_UPPER NVL
POWER
RAWTOHEX REPLACE ROUND ROWIDTOCHAR RPAD RTRIM
SIGN SIN SINH SOUNDEX SQRT SUBSTR SUBSTRB
TAN TANH TO_CHAR TO_DATE TO_LABEL TO_MULTI_BYTE TO_NUMBER TO_SINGLE_TYPE TRANSLATE TRUNC
UPPER USERENV
VSIZE
/C6 "Should Be Reserved"
BEFORE
EACH
FOR
KEY
PRIMARY
WHEN WHERE WHILE
/C7 "CONST Var"
DUP_VAL_INDEX TIMEOUT_ON_RESOURCE TRANSACTION_BACKED_OUT INVALID_CURSOR NOT_LOGED_ON LOGIN_DENIED
NO_DATA_FOUND SYS_INVALID_ROWID TOO_MANY_ROWS ZERO_DIVIDE INVALID_NUMBER STORAGE_ERROR PROGRAM_ERROR VALUE_ERROR
NOTFOUND FOUND



??? ??? //創建臨時表空間

create temporary tablespace zfmi_temp
tempfile 'D:/oracle/oradata/zfmi/zfmi_temp.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;

//tempfile參數必須有


//創建數據表空間

create tablespace zfmi
logging
datafile 'D:/oracle/oradata/zfmi/zfmi.dbf'
size 100m
autoextend on
next 32m maxsize 2048m
extent management local;

//datafile參數必須有


//刪除用戶以及用戶所有的對象

drop user zfmi cascade;

//cascade參數是級聯刪除該用戶所有對象,經常遇到如用戶有對象而未加此參數則用戶刪不了的問題,所以習慣性的加此參數


//刪除表空間
前提:刪除表空間之前要確認該表空間沒有被其他用戶使用之后再做刪除

drop tablespace zfmi including contents and datafiles cascade onstraints;

//including contents 刪除表空間中的內容,如果刪除表空間之前表空間中有內容,而未加此參數,表空間刪不掉,所以習慣性的加此參數
//including datafiles 刪除表空間中的數據文件
//cascade constraints 同時刪除tablespace中表的外鍵參照


如果刪除表空間之前刪除了表空間文件,解決辦法:

如果在清除表空間之前,先刪除了表空間對應的數據文件,會造成數據庫無法正常啟動和關閉。
可使用如下方法恢復(此方法已經在oracle9i中驗證通過):
下面的過程中,filename是已經被刪除的數據文件,如果有多個,則需要多次執行;tablespace_name是相應的表空間的名稱。
$ sqlplus /nolog
SQL> conn / as sysdba;
如果數據庫已經啟動,則需要先執行下面這行:
SQL> shutdown abort
SQL> startup mount
SQL> alter database datafile 'filename' offline drop;
SQL> alter database open;
SQL> drop tablespace tablespace_name including contents;

//創建用戶并指定表空間

create user zfmi identified by zfmi
default tablespace zfmi temporary tablespace zfmi_temp;

//identified by 參數必須有


//授予message用戶DBA角色的所有權限

GRANT DBA TO zfmi;


//給用戶授予權限

grant connect,resource to zfmi; (db2:指定所有權限)


導入導出命令:

Oracle數據導入導出imp/exp就相當于oracle數據還原與備份。exp命令可以把數據從遠程數據庫服務器導出到本地的dmp文件, imp命令可以把dmp文件從本地導入到遠處的數據庫服務器中。 利用這個功能可以構建兩個相同的數據庫,一個用來測試,一個用來正式使用。

執行環境:可以在SQLPLUS.EXE或者DOS(命令行)中執行,
DOS中可以執行時由于 在oracle 8i 中 安裝目錄ora81BIN被設置為全局路徑,
該目錄下有EXP.EXE與IMP.EXE文件被用來執行導入導出。
oracle用java編寫,SQLPLUS.EXE、EXP.EXE、IMP.EXE這兩個文件有可能是被包裝后的類文件。
SQLPLUS.EXE調用EXP.EXE、IMP.EXE所包裹的類,完成導入導出功能。

下面介紹的是導入導出的實例。
數據導出:
1 將數據庫TEST完全導出,用戶名system 密碼manager 導出到D:daochu.dmp中
?? exp system/manager@TEST file=d:daochu.dmp full=y
2 將數據庫中system用戶與sys用戶的表導出
?? exp system/manager@TEST file=d:daochu.dmp owner=(system,sys)
3 將數據庫中的表inner_notify、notify_staff_relat導出
??? exp aichannel/aichannel@TESTDB2 file= d:datanewsmgnt.dmp tables=(inner_notify,notify_staff_relat)

4 將數據庫中的表table1中的字段filed1以"00"打頭的數據導出
?? exp system/manager@TEST file=d:daochu.dmp tables=(table1) query=" where filed1 like '00%'"

上面是常用的導出,對于壓縮,既用winzip把dmp文件可以很好的壓縮。
也可以在上面命令后面 加上 compress=y 來實現。

數據的導入
1 將D:daochu.dmp 中的數據導入 TEST數據庫中。
?? imp system/manager@TEST file=d:daochu.dmp
?? imp aichannel/aichannel@HUST full=y file=d:datanewsmgnt.dmp ignore=y
?? 上面可能有點問題,因為有的表已經存在,然后它就報錯,對該表就不進行導入。
?? 在后面加上 ignore=y 就可以了。
2 將d:daochu.dmp中的表table1 導入
imp system/manager@TEST file=d:daochu.dmp tables=(table1)

基本上上面的導入導出夠用了。不少情況要先是將表徹底刪除,然后導入。

注意:
操作者要有足夠的權限,權限不夠它會提示。
數據庫時可以連上的。可以用tnsping TEST 來獲得數據庫TEST能否連上。

附錄一:
給用戶增加導入數據權限的操作
第一,啟動sql*puls
第二,以system/manager登陸
第三,create user 用戶名 IDENTIFIED BY 密碼 (如果已經創建過用戶,這步可以省略)
第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
?? DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
????? DBA,CONNECT,RESOURCE,CREATE SESSION TO 用戶名字
第五, 運行-cmd-進入dmp文件所在的目錄,
????? imp userid=system/manager full=y file=*.dmp
????? 或者 imp userid=system/manager full=y file=filename.dmp

執行示例:
F:WorkOracle_Databackup>imp userid=test/test full=y file=inner_notify.dmp

屏幕顯示
Import: Release 8.1.7.0.0 - Production on 星期四 2月 16 16:50:05 2006
(c) Copyright 2000 Oracle Corporation. All rights reserved.

連接到: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production

經由常規路徑導出由EXPORT:V08.01.07創建的文件
已經完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的導入
導出服務器使用UTF8 NCHAR 字符集 (可能的ncharset轉換)
. 正在將AICHANNEL的對象導入到 AICHANNEL
. . 正在導入表????????????????? "INNER_NOTIFY"????????? 4行被導入
準備啟用約束條件...
成功終止導入,但出現警告。


附錄二:
Oracle 不允許直接改變表的擁有者, 利用Export/Import可以達到這一目的.
先建立import9.par,
然后,使用時命令如下:imp parfile=/filepath/import9.par
例 import9.par 內容如下:
??????? FROMUSER=TGPMS????
??????? TOUSER=TGPMS2???? (注:把表的擁有者由FROMUSER改為TOUSER,FROMUSER和TOUSER的用戶可以不同)???????
??????? ROWS=Y
??????? INDEXES=Y
??????? GRANTS=Y
??????? CONSTRAINTS=Y
??????? BUFFER=409600
??????? file==/backup/ctgpc_20030623.dmp
??????? log==/backup/import_20030623.log?

總結

以上是生活随笔為你收集整理的oracle常见语句(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产精品99久久久久久小说 | 亚洲日韩欧美视频 | 日韩免费高清在线 | 婷婷激情站 | 中文字幕免费国产精品 | 精品播放| av夜夜操| 97国产精品视频 | 91av电影在线 | 中文av字幕在线观看 | 国内小视频 | 成年人免费在线播放 | 综合久久一本 | 亚洲永久精品视频 | 精品毛片久久久久久 | 在线视频一区观看 | 亚洲www天堂com | 国产美女精品在线 | 日韩精品久久久久久 | 免费观看视频的网站 | 婷婷射五月 | 人人干天天干 | 91福利视频在线 | 激情欧美丁香 | 国产1区2区3区精品美女 | 国产日产av | 91精品免费视频 | 亚洲日本va中文字幕 | 久久久久久久看片 | 黄色影院在线免费观看 | 98久9在线 | 免费 | 激情视频一区二区 | 中文字幕在线观看1 | 美女视频免费一区二区 | 亚洲影视九九影院在线观看 | 天天夜夜狠狠操 | 国产中文欧美日韩在线 | 中文字幕久久网 | 97免费在线观看视频 | 九九精品久久久 | 欧美淫视频| 国产精品成人久久久久久久 | 久久噜噜少妇网站 | 日韩精品免费一区 | 麻豆91网站 | 一区二区免费不卡在线 | 午夜电影久久久 | 91女人18片女毛片60分钟 | 激情五月婷婷 | 成年人免费在线观看网站 | av电影不卡在线 | 伊人婷婷网 | 亚洲国产精品va在线看黑人 | 色五月激情五月 | 国产精品视频大全 | 天天操天天操天天操天天操天天操天天操 | 亚洲精品自拍视频在线观看 | 尤物九九久久国产精品的分类 | 亚洲黄色在线观看 | 在线观看精品一区 | 亚洲作爱视频 | www.午夜| 伊人电影天堂 | 国产在线一卡 | 亚洲精品av在线 | 国产成人久久精品亚洲 | 99高清视频有精品视频 | 亚洲精品在线网站 | 欧美性生活大片 | 91视频国产免费 | 久草视频播放 | 国产视频在线一区二区 | 丁香婷婷综合网 | 亚洲精品视频在线播放 | 亚洲精品免费看 | 丝袜制服天堂 | 深爱激情开心 | 亚洲视屏 | 九九免费在线观看 | 久久夜视频 | 最近最新中文字幕视频 | 婷久久 | 激情久久综合 | 在线观看深夜视频 | 天天干视频在线 | 久久久综合香蕉尹人综合网 | 激情欧美xxxx | 18国产精品白浆在线观看免费 | 国产va在线观看免费 | 少妇精69xxtheporn | 国产精品黄网站在线观看 | 亚洲国产成人在线观看 | 黄色软件视频大全免费下载 | 中文字幕在线国产 | av大片网址 | 色综合小说 | 91麻豆精品国产91久久久久久久久 | 亚洲日本欧美在线 | 天天综合成人网 | 国产视频在线观看一区 | 午夜日b视频 | 99久在线精品99re8热视频 | 日韩视频一区二区三区 | 色婷婷啪啪免费在线电影观看 | 99精品视频在线看 | 91超碰在线播放 | 米奇狠狠狠888 | 一性一交视频 | 手机在线看永久av片免费 | av电影在线免费 | 天天色天天综合 | 国产在线观看免 | 免费观看性生活大片3 | 久久久影院一区二区三区 | 97视频人人澡人人爽 | 国产精品久久久精品 | 国产黄在线 | 国产欧美在线一区二区三区 | 91中文视频 | 亚洲黄色片在线 | 日韩免费视频在线观看 | 视频在线在亚洲 | 欧美日本啪啪无遮挡网站 | 国产精品成人久久久久久久 | 97在线精品 | 99久久综合精品五月天 | 亚洲精品小视频 | 波多野结衣一区二区 | 久久草草影视免费网 | 久久99在线 | 亚洲欧美日韩国产一区二区 | 西西大胆啪啪 | 亚洲成人黄色在线观看 | 99久久精品无码一区二区毛片 | 日韩欧美精品在线观看 | 日韩av中文在线 | 肉色欧美久久久久久久免费看 | 国产在线精品区 | 国产日韩精品一区二区三区 | 免费在线观看污网站 | 国产精品美女免费看 | 992tv又爽又黄的免费视频 | 国产中文字幕亚洲 | 久久天天躁夜夜躁狠狠躁2022 | 午夜.dj高清免费观看视频 | 亚洲激情| 97超级碰碰碰视频在线观看 | 中文理论片| 国产黄在线观看 | 国内精品视频在线 | 久操中文字幕在线观看 | 99视| 久久久久久久久久久高潮一区二区 | 国产精品自产拍在线观看蜜 | 成人app在线播放 | 久久免费的视频 | 天天射天天操天天干 | 久久婷婷视频 | 午夜少妇一区二区三区 | 亚洲春色成人 | 亚洲国产小视频在线观看 | 97超碰在线久草超碰在线观看 | 日韩精品一区二区三区在线视频 | 又黄又爽又色无遮挡免费 | 久久久黄色av | 黄色片网站免费 | 黄色软件在线观看免费 | 蜜臀av夜夜澡人人爽人人桃色 | 成人av电影免费 | 在线黄网站 | 日本精品视频免费 | 欧美另类交在线观看 | 麻豆视频在线免费观看 | 国产97av| 91亚洲狠狠婷婷综合久久久 | 国产高清视频在线免费观看 | 99久久精品免费视频 | 五月天久久综合 | 日日夜夜艹 | 亚洲精品mv在线观看 | 亚洲在线观看av | 欧美精品久久久久久久久老牛影院 | 91av手机在线观看 | 91毛片在线 | 成人免费在线电影 | 国产在线观看99 | 亚洲精品国产视频 | 91精品一区二区三区蜜桃 | 久久久久综合精品福利啪啪 | 国产精品免费观看在线 | av在线免费网| 国产精品一区专区欧美日韩 | 黄色的视频网站 | 国产精品色婷婷视频 | 欧美精品乱码久久久久 | 黄色大片av | 欧美日韩中 | 日本久久高清视频 | 蜜桃视频在线视频 | 国产网站av | 亚洲精品2区 | 97av视频在线 | 欧美一级艳片视频免费观看 | 日韩色在线 | 久久综合加勒比 | 在线黄色免费av | 高清中文字幕av | 蜜臀久久99精品久久久酒店新书 | 在线观看视频免费播放 | 午夜精品一区二区三区在线视频 | 午夜91在线| 日本在线观看中文字幕无线观看 | 国产精品福利午夜在线观看 | 51久久夜色精品国产麻豆 | 视频91在线 | av一级片在线观看 | 日本中文字幕在线一区 | 久久99精品国产麻豆婷婷 | 国产色在线观看 | 久久久香蕉视频 | 国产成人三级三级三级97 | 81国产精品久久久久久久久久 | 久久久精品久久日韩一区综合 | 亚洲日韩中文字幕在线播放 | 国产成人精品一区二区三区网站观看 | 久久激情五月婷婷 | 日韩在线观看中文 | 久久网站最新地址 | 久久er99热精品一区二区三区 | 日韩三级精品 | 日韩三级视频在线观看 | 一级片免费观看视频 | 成人影视免费看 | 天天躁天天操 | 在线v| 色婷婷99 | 丁香婷婷社区 | 1区2区视频 | 欧美激情精品久久久久久 | 极品久久久 | 在线免费观看视频一区二区三区 | 国产在线不卡视频 | 中文字幕亚洲精品在线观看 | 天天亚洲| 中文字幕亚洲精品在线观看 | 国产一区在线观看免费 | 成人在线播放网站 | 国产在线观看你懂得 | 超碰九九| 亚州中文av | 黄色免费在线视频 | 免费av网址在线观看 | 欧美性免费| 国产成人av免费在线观看 | www日| 久久国产三级 | 免费观看久久久 | 久久久亚洲成人 | 999国产在线 | 国产精品一区二区久久 | 亚洲精品456在线播放乱码 | 国产 中文 日韩 欧美 | 日韩高清一区在线 | 天天色综合久久 | 亚洲理论在线观看 | 久草爱 | 久久久麻豆精品一区二区 | 久久免费视频精品 | 欧美成人h版在线观看 | 日韩免费视频观看 | 国内久久久久久 | 天堂av在线网址 | 久久综合视频网 | 911精品视频 | 中文字幕一区二区三区久久蜜桃 | 一区二区视频免费在线观看 | 日韩精品一卡 | 精品视频免费播放 | 日韩国产精品久久 | 欧美成年人在线观看 | 九九免费观看视频 | 国产一级二级三级在线观看 | 免费日韩三级 | 主播av在线 | 免费视频91蜜桃 | 精品在线视频观看 | 97精品超碰一区二区三区 | 九九色综合 | 亚洲免费av网站 | 亚洲精品午夜久久久 | 一级成人在线 | 国产手机在线 | 激情综合五月天 | 欧美日韩99 | 中文字幕在线免费看 | 亚洲婷婷在线 | 久久综合久久综合这里只有精品 | 伊人天天狠天天添日日拍 | 亚洲丝袜一区 | 麻豆视频免费在线观看 | 亚洲精品午夜久久久久久久 | 久久激情五月丁香伊人 | 丁香亚洲| 国产亚洲视频在线 | 中国美女一级看片 | 天天天干天天射天天天操 | 精品国偷自产国产一区 | 福利久久久 | 日本精品xxxx| 国产亚洲精品久久19p | 99精品欧美一区二区三区 | 天堂在线一区 | 欧美午夜久久 | 一区二区三区免费在线观看视频 | 日韩一二区在线观看 | 婷婷六月综合亚洲 | 色偷偷中文字幕 | 狠狠操狠狠操 | 久久久久久久久国产 | 亚洲人在线7777777精品 | 激情五月婷婷综合网 | av官网在线 | 午夜av免费 | 超碰在线个人 | 国产精品mv| 国产麻豆精品免费视频 | 天天综合人人 | 午夜美女av | 久久久人 | 九九色网 | 九九九视频在线 | 91热爆在线观看 | 99麻豆久久久国产精品免费 | 国产一及片| 中文字幕视频观看 | 国产在线精品播放 | 高清av网站| 日韩精品中文字幕av | 成人一区不卡 | 天天添夜夜操 | 在线免费亚洲 | 综合激情av| 午夜精品导航 | 深夜福利视频在线观看 | 最近高清中文字幕 | 99热这里只有精品国产首页 | 亚洲激情校园春色 | 日本黄色一级电影 | 国产精品 999| 最近日韩中文字幕中文 | 天天操夜夜操夜夜操 | 九九热久久久 | 久久99国产精品二区护士 | 亚州精品在线视频 | 最近中文字幕在线播放 | 国产精品久久久久久欧美 | 国产一区在线视频播放 | 欧美一级特黄aaaaaa大片在线观看 | 欧美日韩中文在线观看 | 国产福利专区 | 亚洲天天综合网 | 黄色小网站在线 | 免费美女av | 国精产品999国精产品视频 | 波多野结衣视频网址 | 国产大尺度视频 | 日本99干网 | 国内丰满少妇猛烈精品播放 | 一区二区三区不卡在线 | 国产美女在线精品免费观看 | 久久天堂影院 | 91mv.cool在线观看 | 免费观看国产视频 | 伊人色**天天综合婷婷 | 欧美日韩国产三级 | 国产永久免费观看 | 在线观看午夜av | 久久精品欧美一区二区三区麻豆 | 久草在线资源视频 | 午夜视频在线观看一区二区 | 亚洲 欧美变态 另类 综合 | 亚洲精品一区二区精华 | 久久久久久国产精品久久 | 免费在线观看污网站 | 国产高清成人av | 日日麻批40分钟视频免费观看 | 久久不色 | 亚洲人成人天堂h久久 | 国产成人一区二区三区电影 | 日韩免费视频线观看 | 亚洲免费公开视频 | 五月开心婷婷 | 亚洲综合在线播放 | 国产精品wwwwww | 午夜视频在线观看欧美 | 国产精品亚洲人在线观看 | 亚洲国产精品电影 | 伊人狠狠色丁香婷婷综合 | 亚洲成人精品在线观看 | 首页中文字幕 | 日本福利视频在线 | 精品一二区 | 亚洲一区网 | 国产精品久久久久久超碰 | 欧美日韩在线视频一区 | 亚洲色五月 | 在线高清一区 | 精品视频久久 | 亚洲97在线 | 成人观看视频 | 久久免费视频3 | 天天综合网在线 | 国产成人精品一区二区三区免费 | 黄色成人影视 | 在线精品视频免费播放 | 国内精品久久久久影院优 | 久久久免费精品国产一区二区 | 四虎成人精品在永久免费 | 伊人亚洲综合 | 黄色片视频在线观看 | 日韩高清在线一区二区三区 | 日韩欧美在线播放 | 一区二区三区国 | 国产91免费在线 | 久久久免费高清视频 | 久久免费的精品国产v∧ | 国产伦理一区 | 日韩在线免费 | 最近中文字幕免费视频 | 超碰在线人人97 | 性色视频在线 | av超碰在线 | 99精品欧美一区二区蜜桃免费 | 中文字幕在线播放日韩 | 粉嫩av一区二区三区四区 | 国产精品xxxx18a99 | 国产一级片一区二区三区 | 久久久久久蜜av免费网站 | 亚洲精品在线观 | 免费日韩高清 | 黄色免费观看 | 一个色综合网站 | 91精品视频导航 | 国产精品中文字幕在线 | 成人黄大片 | 久久免费视频一区 | 免费看一级黄色大全 | 狠狠狠综合 | 国产伦精品一区二区三区无广告 | 91av视频播放 | 在线免费av网| 97超碰人人爱 | 久久综合色婷婷 | 91理论片午午伦夜理片久久 | 国产一区二区视频在线 | 美女搞黄国产视频网站 | 中文字幕在线观看av | 国产精品中文久久久久久久 | 欧美日韩在线视频观看 | 成人国产精品久久久春色 | 91系列在线 | 国产精品99在线播放 | 免费看国产一级片 | 黄色综合 | 成人黄色毛片视频 | 在线播放精品一区二区三区 | 97人人澡人人爽人人模亚洲 | 精品国产中文字幕 | 国产精品九九久久久久久久 | a色网站| 色综合天天综合在线视频 | 免费h精品视频在线播放 | 激情综合网五月激情 | 99在线视频网站 | 久久婷婷网| 午夜美女福利 | 一级a毛片高清视频 | 九九热re| 91精品久久久久久粉嫩 | 久久精品视频在线观看免费 | 久久夜av | 日韩黄在线观看 | 超碰在线公开 | 五月婷在线 | 日日精品 | 久久久国产在线视频 | 日日夜夜综合 | 久久综合中文字幕 | 久草在线最新 | 中文字幕综合在线 | 欧美一级性生活片 | 狠狠狠色丁香综合久久天下网 | 人人看人人爱 | 亚州欧美精品 | 成人黄色小说网 | 在线观看黄色av | 黄污网站在线观看 | 亚洲欧洲日韩 | 久久九九久久精品 | 亚洲全部视频 | 在线97 | 91亚州 | 麻豆视频免费播放 | 992tv成人免费看片 | 久久久久亚洲精品成人网小说 | 久久久久久久久久久久电影 | 欧美日韩在线观看一区二区三区 | 成人97人人超碰人人99 | 精品国产美女 | 在线观看黄色 | 久久男人影院 | 国产97av| 国产精品一区二区三区四区在线观看 | 久久精品中文视频 | 99久久一区 | 欧美一级片免费观看 | 探花视频在线观看+在线播放 | 亚洲一二视频 | 视频一区二区在线 | 久久精品99久久久久久2456 | 天天天天色射综合 | 中文字幕在线视频一区二区 | www日日| 国产日韩亚洲 | 97精品国产手机 | 精品国产乱码久久久久久1区二区 | 美女在线观看av | 亚洲a资源 | 91亚洲国产成人 | 亚洲精品网址在线观看 | 亚洲综合激情小说 | 这里只有精品视频在线 | 国产麻豆剧果冻传媒视频播放量 | 婷婷久月 | 亚洲激情 在线 | 人人爱人人添 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 91视频啊啊啊 | 日韩色综合 | 在线国产福利 | 天天操天天射天天插 | 欧美美女视频在线观看 | 欧美伦理一区二区 | 中文字幕av在线不卡 | 久久久久国产精品一区二区 | 特级西西444www大胆高清无视频 | 国产精品国产三级国产不产一地 | 国产不卡在线播放 | www.看片网站| 91在线精品一区二区 | 日本性高潮视频 | 九九99 | 五月激情在线 | 亚洲视频每日更新 | 六月激情 | 日韩一级电影在线观看 | 久草精品在线观看 | 日本黄色大片儿 | 国产一级在线观看 | 免费看成人a | 久久三级视频 | 国产精品久久久久亚洲影视 | 国产亚洲欧美精品久久久久久 | 欧美日本一二三 | 欧美激情在线看 | 四虎伊人| 国内三级在线观看 | www国产亚洲精品 | 在线黄色免费av | 亚洲综合最新在线 | 国产精品观看视频 | 久视频在线播放 | 精品在线观看视频 | 99在线热播精品免费99热 | 丝袜+亚洲+另类+欧美+变态 | 91日韩精品| 久草国产精品 | 国产精品一区二区av | 久久综合色综合88 | 国产在线美女 | 国产成人免费观看久久久 | 免费视频在线观看网站 | 国产精品区一区 | 超碰个人在线 | 中文字幕999 | 国产视频精品免费 | 国产精品国内免费一区二区三区 | 91亚洲精品国偷拍 | 国产五十路毛片 | 青青河边草免费 | 国产精品第三页 | 亚洲精品视频第一页 | 色99视频| 欧美亚洲一级片 | 不卡的av在线播放 | 99这里精品 | 成人a级网站| 婷婷 综合 色 | 成人久久亚洲 | 人人射 | 激情五月婷婷丁香 | 国产99久久精品一区二区永久免费 | av激情五月| 亚洲欧洲精品一区 | 涩涩伊人 | 91精品国自产在线偷拍蜜桃 | 日日夜夜操av | 成人毛片网 | 国产免码va在线观看免费 | 久久精品视频网 | 日本中文字幕电影在线免费观看 | 中文字幕日韩国产 | 深夜免费福利视频 | 国产福利中文字幕 | 亚洲国产日韩av | 在线观看免费国产小视频 | 日本在线观看中文字幕无线观看 | 国产香蕉av | 日韩一区二区三免费高清在线观看 | 国产亚洲精品久久久久久电影 | 中文字幕日韩电影 | 久久久麻豆精品一区二区 | 日韩网站在线播放 | 日韩91在线 | 中文字幕91视频 | 成人免费ⅴa | 美女黄频在线观看 | 91最新国产 | 欧美激情精品久久久 | 在线免费观看一区二区三区 | 欧美精品二 | 久久久久久久久影视 | 欧美成人手机版 | 欧美三级在线播放 | 人人澡人人爽欧一区 | 丁香婷婷激情五月 | 超碰人人干人人 | 国产综合激情 | 操操操天天操 | 人人狠| 日韩av在线一区二区 | 啪啪激情网| 伊人狠狠 | 久久免费精品国产 | 91麻豆精品国产91久久久无限制版 | 成人免费在线网 | 欧美在线一 | 久久国产精品久久久久 | 国内免费久久久久久久久久久 | 亚洲一级免费电影 | 国产一区麻豆 | 在线 成人 | 久二影院 | 久久福利小视频 | 国产一级电影免费观看 | 亚洲视频久久久 | 亚洲一区二区观看 | 午夜久久久久久久久 | 最新国产中文字幕 | 97操操操| 日韩有码欧美 | 精品久久免费看 | 超碰97免费在线 | 国产69精品久久app免费版 | 国内精品视频一区二区三区八戒 | 欧美综合色在线图区 | 六月丁香激情综合色啪小说 | 美女一区网站 | 国产成人专区 | 综合精品久久 | 天天躁日日躁狠狠躁 | 国产一区视频在线 | 国内精品久久久久久久影视麻豆 | 在线亚洲午夜片av大片 | 久久精品中文字幕免费mv | 91精品网站| 国产午夜精品av一区二区 | 欧美日韩国产页 | 精品国产一区二区三区久久久 | 91成版人在线观看入口 | av在线网站大全 | 丁香婷婷色综合亚洲电影 | 欧美日韩伦理一区 | 深爱婷婷激情 | 91九色在线视频观看 | 成人激情开心网 | 亚洲精品91天天久久人人 | 久久久久国产精品免费网站 | 在线电影 一区 | 久久久av免费 | 99热超碰在线 | 黄色在线网站噜噜噜 | 国产91免费观看 | 精品福利av | 四虎影视成人精品 | 国产欧美高清 | 国产成人精品午夜在线播放 | 日本久久久亚洲精品 | 91麻豆精品91久久久久同性 | 日韩欧美在线第一页 | 99re6热在线精品视频 | 99精品电影 | 在线观看亚洲专区 | 久久久999免费视频 日韩网站在线 | 操久在线| 69国产盗摄一区二区三区五区 | 久久韩国免费视频 | 日韩高清一区 | 久久久久久片 | 欧美不卡视频在线 | 日本精品视频网站 | 伊人天天狠天天添日日拍 | 操一草| 啪一啪在线 | 中文字幕av在线免费 | 五月激情丁香图片 | 高清不卡免费视频 | 欧美日韩国产二区 | 久久久久久久电影 | 精品久久久久久久久久久久久久久久久久 | 91精品视频一区二区三区 | 3d黄动漫免费看 | 五月天亚洲婷婷 | 国产精品免费视频网站 | 国产精品第二页 | 久草免费在线观看 | www.久草.com | 欧美a性 | 最近中文字幕免费 | 欧女人精69xxxxxx | 深爱激情五月婷婷 | 亚洲影视资源 | 超碰在线人人艹 | 一区二区精品在线观看 | 激情视频一区二区三区 | 国产不卡一二三区 | www黄色com | 天天干,天天干 | 国产999视频| 国产日韩欧美视频在线观看 | 激情久久久久 | 中文字幕在线视频一区二区 | 首页国产精品 | 九九精品视频在线看 | av看片网址 | 99视频导航 | 日韩精品久久久久久久电影99爱 | a级黄色片视频 | 精品美女国产在线 | 一区三区在线欧 | 成人黄色电影在线播放 | 蜜臀av一区二区 | 91最新中文字幕 | 天天亚洲 | 麻豆传媒在线视频 | 国产午夜精品一区二区三区四区 | 国产国产人免费人成免费视频 | av在线免费在线观看 | 69精品| 国产成人在线观看 | 欧美精品在线视频观看 | 黄色成人在线观看 | 国产日本亚洲 | 国产精品高潮在线观看 | 亚洲精欧美一区二区精品 | 少妇视频在线播放 | 精品久久久久久久久久久久 | 久久免费看av | av福利在线看 | 91看片淫黄大片一级在线观看 | 国产成人在线精品 | 久久刺激视频 | 久久久福利视频 | av在线之家电影网站 | 亚洲爱av | 亚洲一区二区麻豆 | 激情视频网页 | 五月天六月丁香 | 久久成人人人人精品欧 | 91豆花在线观看 | 国产精品1000 | 日韩av免费大片 | 视频在线观看国产 | 黄色电影网站在线观看 | 九九九九色 | 国产精品久久三 | 欧美孕妇与黑人孕交 | 亚洲va欧美va人人爽 | 性色va| 中文亚洲欧美日韩 | 91手机视频 | 久久国产精品第一页 | 日本公乱妇视频 | 久久久午夜影院 | 久久久久久久久电影 | 日日摸日日添日日躁av | 色婷婷福利| 国产二区电影 | 久久这里只有精品首页 | 国产精品久一 | zzijzzij亚洲日本少妇熟睡 | 狠日日| 亚州欧美视频 | 国产色小视频 | www好男人 | 超碰av免费| 成人福利在线播放 | 国产亚洲成人精品 | 五月天综合激情 | 国产一级片在线播放 | 操操综合 | 狠狠狠狠干 | 91精品久久久久久久99蜜桃 | 欧美日韩高清一区 | 一区二区精品视频 | 91亚色视频| 99精品亚洲| 国产欧美三级 | 91九色蝌蚪在线 | 中文字幕4 | 国产女v资源在线观看 | 丝袜+亚洲+另类+欧美+变态 | 国产一级免费观看视频 | 成人精品一区二区三区电影免费 | 久久女同性恋中文字幕 | av成人亚洲| 欧美日韩精品在线一区二区 | 69国产精品成人在线播放 | 久久午夜精品 | 中文字幕一区2区3区 | 亚洲一区不卡视频 | 日韩欧美成 | 在线免费观看国产 | 日韩精品在线看 | av综合网址 | 亚洲精品玖玖玖av在线看 | 日韩成人在线免费观看 | 黄网站免费久久 | 久久久免费毛片 | 欧美91视频 | 操操操日日日干干干 | 日韩高清一二区 | 欧美日韩高清一区二区三区 | 久久这里有精品 | 欧美一级黄大片 | 婷婷伊人五月天 | 国产黄色片免费在线观看 | 97人人网| 91传媒视频在线观看 | 国产在线黄 | 久久精品欧美日韩精品 | 亚洲.www | 中文字幕超清在线免费 | 国产欧美日韩一区 | 草免费视频 | 91最新地址永久入口 | 欧美日韩视频在线播放 | 国产一区在线免费观看 | 国产99久久九九精品免费 | 亚洲乱码久久 | 夜夜躁日日躁 | 在线观看日本韩国电影 | 91精品国产自产老师啪 | 福利一区在线视频 | 一区在线免费观看 | 亚洲免费激情 | 日本中文乱码卡一卡二新区 | 日日躁你夜夜躁你av蜜 | 色综合久久99 | 欧美色黄 | 欧美a级片网站 | 五月天天在线 | 亚洲精品乱码久久久久v最新版 | 久久理论影院 | 在线免费观看麻豆视频 | 久久久久久久久久久免费视频 | 日日操天天操夜夜操 | 人人插人人舔 | 四虎最新入口 | 99热最新地址 | 狠狠的日日 | 久久99国产精品久久99 | 操操操夜夜操 | 国模精品在线 | 国产精品免费一区二区三区 | 久草精品视频在线看网站免费 | 亚洲精品日韩一区二区电影 | 久草电影在线观看 | 色综合五月天 | 国产亚洲欧美在线视频 | 三上悠亚在线免费 | av成人免费观看 | 在线观看一区二区精品 | 久久国产精品一区二区 | 日韩一级片网址 | 久久极品| 激情综合色综合久久 | 精品一区 精品二区 | 色资源二区在线视频 | 日日干夜夜干 | 99电影 | 亚洲精品黄网站 | 美女视频黄频 | 国产69精品久久久久久 | 就要干b| 国产精品一区二区三区视频免费 | 婷婷六月丁香激情 | 久久精品首页 | 欧美日韩在线免费观看视频 | 国产色婷婷 | 久热免费在线观看 | 国产亚洲小视频 | 久久精视频 | 久久99国产精品二区护士 | 国产69精品久久久久9999apgf | 97在线视频免费观看 | 最近中文字幕免费观看 | 99久久精品国产亚洲 | 精品 激情 | 免费视频一区 | 国产在线精品国自产拍影院 | 色五丁香 | 美女黄频在线观看 | 天天夜夜亚洲 | 四虎影视8848dvd | 中文字幕日韩国产 | 人人爽人人射 | 99色免费 | 成人午夜精品久久久久久久3d | 97久久精品午夜一区二区 | 久久久噜噜噜久久久 | 国产精品婷婷午夜在线观看 | 美女网站视频免费都是黄 | 91香蕉国产在线观看软件 | 色999精品 | 国产一区免费看 | 狠狠干成人综合网 | 精品国产一区二区三区久久久蜜臀 | av解说在线观看 | av高清一区二区三区 | 欧美日韩一区三区 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产精品一区二区av影院萌芽 | 久久99精品国产麻豆宅宅 | 国产精品免费成人 | 国产精品初高中精品久久 | 国产手机视频在线播放 | 免费视频91蜜桃 | www免费视频com━ | a级成人毛片| 日韩二区在线 | 麻豆久久一区二区 | 欧美极品一区二区三区 | 激情在线免费视频 | 欧美日韩性 | www.色午夜.com| 精产嫩模国品一二三区 | 大型av综合网站 | 国产视频在线免费 | 亚洲综合成人在线 | 国产露脸91国语对白 | 国产最新网站 | 在线国产99 | 久久激情综合网 | 精品免费视频. | 中文字幕在线观看视频一区 | 在线观看久久久久久 | 麻豆久久久 | 日日干天天插 | 91在线视频免费播放 | 色狠狠久久av五月综合 | 亚洲狠狠丁香婷婷综合久久久 | www日韩视频 | 日韩最新中文字幕 | 免费看污片| 久久一精品 | 欧美成天堂网地址 | 国产一区二区在线观看免费 | 国产一区二区在线免费播放 | 黄色免费网站 | 欧美一级日韩三级 | 奇人奇案qvod| 91激情视频在线观看 | 天天干天天操天天操 | 日韩美女一级片 | 96视频免费在线观看 | 伊人激情网 | 久久综合毛片 | 成人免费视频在线观看 | 国产精品系列在线播放 | 色网免费观看 | 天天爱天天 | 日韩成人邪恶影片 | 成人久久免费 | 在线看岛国av | 日韩av成人在线 | 久久久久久久国产精品 | 婷婷视频在线 |