--$理論知識$--
--$$、三大范式
第一范式(1NF):字段是原子性的,不可分;
第二范式(2NF):有主鍵,非主鍵字段依賴主鍵。確保一個表只說明一個事物
第三范式(3NF):非主鍵字段不能相互依賴。 每列都與主鍵有直接關系,不存在傳遞的依賴
--$$--理論知識匯總
1.數據模型組成三要素:數據結構,數據操作和完整性約束條件
2.數據庫系統的三級模式結構:模式,外模式和內模式
3.數據庫是長期存儲在計算機內,有組織的,可共享的大量數據的集合
4.數據庫的基本特征:數據按一定的數據模型組織、描述和儲存,可為各種用戶共享,冗余度較小,數據獨立性較高,易擴展
5.數據庫系統的構成:數據庫,數據庫管理系統(及其開發工具),應用系統,數據庫管理員
6.SQL語句的基本特點:綜合統一,高度非過程化,面向集合的操作方式,以同一種語法結構提供多種使用方式,語言簡潔。
7.SQL的功能:數據定義、數據操縱、數據控制
8.自主授權控制實現機制:SQL語言,GRANT和REVOKE語句實現
9.數據庫安全性控制的方法:用戶標識與鑒別,存取控制,授權與回收
10.數據庫保護涉及的問題:安全性,完整性,數據庫恢復和并發控制(死鎖問題)
11.加密的方法:替換、置換、兩種結合
12.數據庫完整性的方法:實體完整性、參照完整性和自定義完整性
13.數據的完整性和安全性是兩個不同概念:
1.數據的完整性:防止數據庫中存在不符合語義的數據,也就是防止數據庫中存在不正確的數據,防范對象:不合語義的、不正確的數據
2.數據的安全性:保護數據庫防止惡意的破壞和非法的存取,防范對象:非法用戶和非法操作
14.數據庫設計的步驟:需求分析(用戶需求),概念結構設計(E-R圖),邏輯結構設計(視圖),物理結構設計(索引)數據庫實施,數據庫運行和維護
15.數據字典的內容:數據項,數據結構,數據流,數據存儲,處理過程
16.E-R圖合并的沖突:屬性沖突,命名沖突,結構沖突
17.優化數據模型的方法:確定數據依賴,消除冗余的聯系,確定所屬范式
18.引入嵌入式編程的原因:SQL是非過程的語言,事務處理應用需要高級語言
19.高級語言和SQL語言的作用:前者是負責控制數據流程,后者負責操縱數據庫
20.SQL通信區的作用:向主語言傳遞SQL語句的執行狀態信息,使主語言能夠據此控制程序流程
21.主變量的作用:向SQL語句提供參數,將SQL語句查詢數據庫的結果交主語言進一步處理
22.游標:解決集合性操作語言與過程性操作語言的不匹配。(數據緩沖區,存放SQL語句的執行結果)
23.為什么使用游標:SQL語言與主語言具有不同數據處理方式。SQL語言是面向集合的,一條SQL語句原則上可以產生或處理多條記錄。主語言是面向記錄的,一組主變量一次只能存放一條記錄。僅使用主變量并不能完全滿足SQL語句向應用程序輸出數據的要求。嵌入式SQL引入了游標的概念,用來協調這兩種不同的處理方式
24.常見的存儲介質及其特征:高速緩存存儲器:容量小,速度快,最昂貴。主存儲器:斷電時,貯存內容丟失。快閃存儲器:非易失。磁盤存儲器:長期聯機數據存儲。光學存儲器:光學存儲到光盤上。磁帶存儲器:順序訪問數據
25.磁盤的請求模式:順序訪問模式:連續的請求會請求處于相同磁道或相鄰磁道上連續的塊。只需要一次尋道時間。隨機訪問模式:連續的請求會請求隨機位于磁盤上的塊,效率較低。
26.優化方法:緩沖:從磁盤讀取的數據暫時存在內存緩沖區里。預讀:當一個磁盤塊被訪問時,相鄰磁道的連續快也被讀入內存緩沖區中。調度:按塊經過讀寫頭的順序發出訪問請求。電梯算法。
27.定長記錄:多個文件,在任意一個文件只存儲一個固定長度的記錄。變長記錄:構造自己的文件,使之容納多種長度的記錄。
28.文件組織記錄的幾種方法:堆文件:任意存放。順序文件組織方式:記錄根據其 搜索碼 的值順序存儲。散列文件組織方式:在每條記錄的某些屬性計算一個散列函數,根據其值計算。搜索碼是一個屬性或多個屬性的集合,不一定是主碼。在物理上,盡可能接近搜索碼的順序存儲記錄。插入新紀錄時,若位置空閑,則直接插入,否則插入溢出塊。記錄過多,則需要文件重組,保證搜索碼和物理存儲順序的一致性。
29.緩沖區機制:當數據庫系統中的程序需要磁盤上的塊時,它向緩沖區管理器發出請求(即調用)。如果這個塊在緩沖區中,緩沖區管理器將這個塊在主存中的地址傳給請求者。如果這個塊不在緩沖區中,緩沖區首先為這個塊分配空間(必要時,移出一些塊,這個塊必須已經被寫回磁盤),然后把請求的塊從磁盤讀入緩沖區中,并將這個塊在主存中的地址傳給請求者。
30.應用的技術:緩沖區替換策略:移除最近最少使用的寫回磁盤并從緩沖區移走。被釘住的塊:使數據庫系統從崩潰中回復,限制一個塊寫回磁盤的時間。塊的強制寫出:把塊強制寫回磁盤。防止數據丟失
31.查詢處理優化:查詢-通過語法分析器與翻譯器轉化為關系代數表達式-通過優化器優化執行計劃-執行引擎得到查詢結果。
32.事物的特性:原子性、一致性、持續性、隔離性
33.事務是一個數據庫操作序列;一個不可分割的工作單位;恢復和并發控制的基本單位
34.數據庫常見故障種類及其恢復策略:故障種類:事物內部的故障:撤銷事務(UNDO)。系統故障(軟故障):若事務未提交,強行撤銷所有未完成事務。事務提交:但緩沖區中的信息尚未完全寫回到磁盤上:重做(REDO)所有已提交的事務。介質故障(硬故障):裝入數據庫發生介質故障前某個時刻的數據副本;重做自此開始時的所有成功事務,將這些事務已提交的結果重新計入數據庫。計算機病毒:殺毒!
-------------1.用戶管理/權限------------------
-------1.1 用戶管理
-- 創建
create user checker --用戶
identified by 1qaz@wsx --密碼
default tablespace users --默認表空間
temporary tablespace temp --臨時表空間
quota 10M on users --賦予默認表空間賦予checker用戶10M空間(超過則無法使用,除非再次申請)
-- 修改
alter user checker quota 20M on users;--若在建表時沒有指定,可以通過該方法執行
alter user checker identified by 123456;--修改密碼
alter user checker account unlock;--若checker用戶被鎖,可登入system、scott、sys等具有dba權限的用戶下解鎖
-- 刪除
drop user checker cascade;--刪除用戶、該用戶下所有表都會被刪掉
-------1.2 用戶權限
---- 授權
-- 系統權限
grant connect,resource to checker;--訪問資源權限
grant create session,create table to user2 with admin option; --再次授權
-- 對象授權
grant select,insert,delete on scott.emp to user2; --某用戶下的某張表賦予增刪改權限
--回收權限
revoke resource to user2;--收回user2的權限
revoke delete on scott.emp from user2;--收回user2的刪除權限
--查詢
DBA_USERS? ? ? --用戶基本信息表
DBA_SYS_PRIVS? --系統權限
DBA_TAB_PRIVS? --對象權限
USER_SYS_PRIVS --用戶系統權限
ROLE_SYS_PRIVS --用戶角色
ALL_TABLES? ? --可查詢的所有表
USER_TAB_PRIVS --用戶將權限授予哪些用戶
ALL_TAB_PRIVS? --哪些用戶給自己授權
-------1.3 用戶角色
----預定義
--connect/resource/dba/exp_full_database/imp_full_database
--創建
create role designer identified by 123456;
grant create view,create table to designer;
--授予
grant designer to user2;
--管理
select * from role_sys_privs where role='DESIGNER';
alter role designer not identified;
alter role designer identified by 9ol.0p;/; --修改role的密碼
-- set role designer;--置為生效
--刪除
drop role designer;
-------1.4 資源配置PROFILE
--管理密碼
create profile lock_account limit
failed_login_attempts 5
password_lock_time 7;
--password_life_time/password_grace_time
--password_reuse_time/password_reuse_max
--password_verify_function
alter user user profile lock_account;
--管理資源
alter system set resource_limit=true;
alter profile password_lift_time limit
cpu_per_session 20000
session_per_user 10
cpu_per_call 500
passeord_life_time 180
failed_login_attempts 10;
--刪除資源管理
drop profile password_life_time cascade;
--查詢?
select profile from dba_users where username='SCOTT';
select resource_name,resource_type,limit from dba_profiles where profile='DEFAULT';
-------------2.數據對象-----------------
----2.1? 數據表
---------2.1.1? 創建普通表
create table students(
? stuno number(10) not null,? --非空約束
? stuname varchar2(8),
? id varchar2(18) constraint ID_UK unique,? --唯一性約束
? sex char(2),
? age int constraint AGE_CK check(age > 0 and age < 120) disable,? --禁用
? departno varchar2(2) not null,
? classno varchar2(4) not null,
? regdate date default sysdate,
? ---blob/clob/bfile
? constraint STU_PK primary key(stuno)? ---主鍵約束
)tablespace users? --表空間
storage(initial 256k)? --存儲參數next/minextents(AUTOALLOCATE)
pctfree 20? --數據塊最小空閑空間比例,達到后標記不可用
pctused 40? --數據庫是否可用界限
initrans 10? --允許并發事務數目
nologging;? --DDL操作不產生日志
--------2.1.2創建臨時表
----------2.1.2.1? 會話級別臨時表
--會話級臨時表是指臨時表中的數據只在會話生命周期之中存在,
--當用戶退出會話結束的時候,Oracle自動清除臨時表中數據。
create global temporary table
aaa
(
id number
) on commit oreserve rows;
insert into aaa values(100);
select * from aaa;
---------2.2.2.2事務級別的臨時表
create global temporary table
bbb
(id number
) on commit delete rows;
insert into bbb values(200);
select * from bbb;
--這時當你執行了commit和rollback操作的話,再次查詢表內的數據就查不到了。
----維護
--字段
alter table students add(province varchar2(10));--添加字段
alter table students drop column province;--刪除列
alter table students drop (sex,age); --刪除多列
alter table students modify departno varchar2(4);--修改字段長度
--重命名
alter table students rename to students_bak;--重命名表名
alter table students rename column A to A_id;--重命名列名
--表空間
alter table students move tablespace tbsp_2;
--存儲參數
alter table students pctfree 25 pctused 45;
--刪除
drop table students cascade constraints;? --同時刪除視圖,約束或觸發器等
flashback table students to before drop;? --閃回
--狀態
alter table students read only;? --設置表只讀
--約束
alter table students modify stuno not null;? --修改約束
alter table students add constraint STUD_PK(stuno);--添加主鍵
alter table students drop constraint STUD_PK;--刪除主鍵
alter table students add constraint IDs_UK unique(id);--添加唯一性約束
alter table students drop constraint IDs_UK;--刪除唯一性約束
alter table students add constraint DEPART_FK foreign key(department_id)
? ? ? reference departments(department_id);? --外鍵約束
alter table students drop constraint depart_FK;--刪除外鍵約束
alter table students enable validate constraint depart_FK;? --novalidate
alter table students disable constraint depart_FK;
----2.2? 索引(Index)
---創建
create index emp_deptno_index
on emp(deptno)
pctfree 25? --reverse
tablespace users;
--合并
alter index emp_deptno_index coalesce deallocate unused;
--重建
alter index emp_deptno_index rebuild;
--刪除
drop index emp_deptno_index;
--查詢
select table_name.index_name,index_type from dba_indexes where owner='HR'; --表索引sys
select column_name,column_length from user_ind_columns where index_name='EMP_DEPTNO_INDEX';--索引列scott
select tablespace_name,segment_type,bytes from user_segments where segment_name='EMP_DEPTNO_INDEX';--索引段scott
select column_expression from user_ind_expressions where index_name = 'EMP_JOB_FUN';? --函數索引
----2.3? 視圖(View)
--創建
create or replace view emp_view as
? select d.dname,d.loc,e.empno,e.ename
? from emp e, dept d
? where e.deptno = d.deptno and d.deptno = 20
with read only;
---查看
select * from emp_view;
desc emp_view;
---重新編譯
alter view emp_view compile;
---刪除
drop view emp_view;
----2.4? 同義詞(Synonym)
---創建
create public synonym public_dept for scott.dept;
create synonym private_dept for dept;
---刪除
drop public synonym public_dept;
drop synonym private_dept;
----2.5? 序列(Sequence)
---創建
alter sequence empno_seq
start with 100 --從多少開始
maxvalue 100000? --minvalue/nominvalue/nomaxvalue? --最大值(最小值/無最小值/無最大值)
increment by 200? --(增量)步長
cache 100? --緩存
cycle? --nocycle 循環
order? --noorder? 順序
---管理
alter sequence empno_seq
maxvalue 500000
increment by 200;
---刪除
drop sequence empno_seq;
----2.6? 物化視圖
---基本理論知識
1、物化視圖的類型:ON DEMAND、ON COMMIT
二者的區別在于刷新方法的不同,ON DEMAND 顧名思義,僅在該物化視圖“需要”被刷新了,才進行刷新(REFRESH),即更新物化視圖,以保證和基表數據的一致性 ;
而ON COMMIT是說,一旦基表有了COMMIT,即事務提交,則立刻刷新,立刻更新物化視圖,使得數據和基表一致。
2、ON DEMAND物化視圖
物化視圖的創建本身是很復雜和需要優化參數設置的,特別是針對大型生產 數據庫 系統而言。但Oracle允許以這種最簡單的,類似于普通視圖的方式來做,所以不可避免的會涉及到默認值問題。也就是說Oracle給物化視圖的重要定義參數的默認值處理是我們需要特別注意的。
物化視圖的特點:
? (1) 物化視圖在某種意義上說就是一個物理表(而且不僅僅是一個物理表),這通過其可以被user_tables查詢出來,而得到佐證;
? (2) 物化視圖也是一種段(segment),所以其有自己的物理存儲屬性;
? (3) 物化視圖會占用數據庫磁盤空間,這點從user_segment的查詢結果,可以得到佐證;
3、物化視圖的數據怎么隨著基表而更新?
Oracle提供了兩種方式,手工刷新和自動刷新,默認為手工刷新 。也就是說,通過我們手工的執行某個Oracle提供的系統級存儲過程或包,來保證物化視圖與基表數據一致性。這是最基本的刷新辦法了。自動刷新,其實也就是Oracle會建立一個job,通過這個job來調用相同的存儲過程或包,加以實現。
4、ON DEMAND物化視圖的特性及其和ON COMMIT物化視圖的區別
"ON DEMAND"不刷新(手工或自動)就不更新物化視圖,而"ON COMMIT"不刷新也會更新物化視圖,——只要基表發生了COMMIT。
創建定時刷新的物化視圖:
---創建語法
create materialized view mv_name refresh force on demand start with sysdate
next sysdate+1 (指定物化視圖每天刷新一次)
create materialized view mv_name refresh force on commit as select * from table_name
--更新
alter materialized view mv_name
refresh force on demand start with sysdate next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss')
---刪除
drop materialized view mv_name
-----------------3.表/索引分區--------------------------
----3.1? 表分區
---創建
--范圍
create table ware_retail_part
(
? id integer primary key,
? retail_date date,
? ware_name varchar2(50)
)
partition by range(retail_date)
(
? partition par_01 values less than(to_date('2011-04-01','yyyy-mm-dd')) tablespace TBSP_1,
? partition par_02 values less than(to_date('2011-07-01','yyyy-mm-dd')) tablespace TBSP_1,
? partition par_03 values less than(to_date('2011-10-01','yyyy-mm-dd')) tablespace TBSP_2,
? partition par_04 values less than(to_date('2012-01-01','yyyy-mm-dd')) tablespace TBSP_2
);
--散列
create table goods
(
? id number,
? goodname varchar2(50)
)
storage(initial 2048k)
partition by hash(id)
(
partition par1 tablespace tbsp_1,
partition par2 tablespace tbsp_2
);
--列表
create table clients
(
? id integer primary key,
? name varchar2(50),
? province varchar2(20)
)
partition by list(province)
(
? partition shandong values('山東省'),
? partition guangdong values('廣東省'),
? partition yunnan values('云南省')
);
--組合分區
create table person2
(
? id number primary key,
? name varchar2(20),
? sex varchar2(2)
)
partition by range(id)? --范圍分區
subpartition by hash(name)? --hash子分區
subpartitions 2 store in(tbsp_1,tbsp_2)? --存儲在兩個不同的命名空間中
(
? partition par1 values less than(5000),
? partition par2 values less than(10000),
? partition par3 values less than(maxvalue)
);
--間隔分區
create table saleRecord
(
id number primary key,
goodsname varchar2(50),
saledate date,
quantity number
)
partition by range(saledate)
interval (numtoyminterval(1,'year'))
(
? partition par_fist values less than (to_date('2012-01-01','yyyy-mm-dd'))
);
--應用
insert into ware_retail_part values(1,to_date('2011-01-20','yyyy-mm-dd'),'PC');
insert into ware_retail_part values(2,to_date('2011-04-15','yyyy-mm-dd'),'TV');
select * from ware_retail_part partition(par_02);
---管理
--添加
alter table clients
add partition hebei values('河北省')
storage(initial 10K next 20k) tablespace tbsp_1
nologging;
--合并
alter table person coalesce partition;
alter table person2 modify partition par3 coalesce subpartition;
--刪除
--disable constraint/drop/enable constraint
delete from ware_retail_part where retail_date>=to_date('2011-10-01','yyyy-mm-dd');? --數據
alter table ware_retail_part drop partition par_04;? --表分區
alter index ware_index rebuild;? --重建索引
--并入
alter table sales merge partitions part_sea3,part_sea4 into partition part_sea4;
alter table sales modify partition part_sea4 rebuild unusable local indexes;? --重建局部索引
----3.2? 索引分區
---創建
--本地
--create tablespace ts_1/ts_2/ts_3;
--create table studentgrade partition by range(grade);
create index grade_index on studentgrade(grade)
local
(
? partition p1 tablespace ts_1,
? partition p2 tablespace ts_2,
? partition p3 tablespace ts_3
);? --dba_ind_partitions
--全局
create index index_SalePrice on Books(SalePrice)
global partition by range(SalePrice)
(
? partition p1 values less than (30),
? partition p2 values less than (50),
? partition p3 values less than (maxvalue)
);
---管理
--刪除
alter index index_saleprice drop partition p2;
alter index index_saleprice drop partition p1;
alter index index_saleprice rebulid partition p3;
--重命名
alter index index_saleprice rename partition p3 to p_new;
---------------4.數據庫管理--------------------
------4.1 數據文件/表空間
---查看
select tablespace_name,file_name,bytes from dba_data_files order by tablespace_name;
---默認
select segment_type,segment_name,owner from dba_segments where tablespace_name='USERS';
--SYSTEM/SYSAUT/UNDOTBS1/USERS/EXAMPLE/TEMP
---創建
--本地化管理方式
create tablespace tbs_test_1 datafile 'D:\OracleFiles\OracleData\datafile1.dbf' --創建表空間文件
size 10m
extent management local uniform size 256K;? --autoallocate
--段空間管理方式
create tablespace tbs_test_3 datafile 'D:\OracleFiles\OracleData\datafile3.dbf'
size 20m
extent management local autoallocate
segment space management manual;? --auto
--非標準塊
alter system set db_16k_cache_size = 16M scope=both;
create tablespace tbs_test_5 datafile 'D:\OracleFiles\OracleData\datafile5.dbf'
size 64m reuse
autoextend on next 4m maxsize unlimited
blocksize 16k
extent management local autoallocate
segment space management auto;
--大文件
create bigfile tablespace tbs_test_big datafile 'D:\OracleFiles\OracleData\datafilebig.dbf'
size 2g;
---維護
--默認
alter database default temporary tablespace temp_1;
alter database default tablespace tbs_example;
--狀態
alter tablespace tbs_test_3 read only;? --read write
--重命名
alter tablespace tbs_test_3 rename to tbs_test_3_new;
--刪除
drop tablespace tbs_test_1 including contents cascade constraint;
--文件
alter tablespace users add datafile 'e:\app\Administrator\oradata\orcl\users02.dbf' size 10M autoextend on next 5M maxsize unlimited;? --添加
alter tablespace users drop datafile 'e:\app\Administrator\oradata\orcl\users02.dbf';? --刪除
alter database datafile 'D:\OracleFiles\OracleData\datafile2.dbf'
autoextend on next 10m maxsize unlimited;? --自動擴展
---撤銷表空間
--創建
create undo tablespace undo_tbs_1
datafile 'D:\OracleFiles\OracleData\undotbs1.dbf'
size100M;
--修改
alter tablespace undo_tbs_1
add datafile 'D:\OracleFiles\OracleData\undotbs_add.dbf'
size 2g;
--切換
alter system set undo_tablespace=undo_tbs_1;
--刪除
alter system set undo_tablespace=undotbs1;
drop tablespace undo_tbs_1;
--查詢
show parameter undo_tablespace;? --undo_management/undo_retention
select tablespace_name from dba_tablespaces where contents = 'UNDO';
select to_char(begin_time,'hh24:mi:ss'), to_char(end_time,'hh24:mi:ss'), undoblks
from v$undostat order by begin_time;? --表空間統計信息
select rn.name,rs.xacts,rs.writes,rs.extents
from v$rollname rn,v$rollstat rs where rn.usn = rs.usn;? --段統計信息
select name,status from v$transaction;? --活動事務
select segment_name, extent_id,bytes,status from dba_undo_extents
where segment_name='_SYSSMU3_991555123$';? --UNDO區信息
---臨時表空間
--創建
create temporary tablespace temp_01 tempfile 'D:\OracleFiles\tempfiles\temp_01.tpf' size 300m;
alter database default temporary tablespace temp_01;
--重命名/刪除同上
--查詢
select file_name,bytes,tablespace_name from dba_temp_files;
---臨時表空間組
create temporary tablespace tp1 tempfile 'D:\OracleFiles\tempfiles\tp1.tpf'
size 10m tablespace group group1;
create temporary tablespace tp2 tempfile 'D:\OracleFiles\tempfiles\tp2.tpf'
size 20m tablespace group group1;? --創建
create temporary tablespace tp3 tempfile 'D:\OracleFiles\tempfiles\tp3.tpf'
size 10m tablespace group group3;
alter tablespace tp1 tablespace group group3;? --轉移
alter user hr temporary tablespace group3;? --分配
alter database orcl default temporary tablespace group3;? --默認
drop tablespace tp1 including contents and datafiles;
------4.2 控制文件
---多路復用
alter system set control_file=
? 'D:\PROGRAM\ORACLE\ORADATA\ORCL\CONTROL01.CTL',
? 'D:\PROGRAM\ORACLE\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL',
? 'D:\OracleFiles\ControlFiles\CONTROL03.CTL'
scope=spfile;? --參數設置后復制文件
select name from v$controlfile;? --查看
---創建
select member from v$logfile;? --查看日志文件
select name from v$datafile;? --查看數據文件
select name from v$controlfile;? --查看控制文件
shutdown immediate;? --關閉數據庫,然后備份文件
startup nomount;? --啟動數據庫實例,不加載數據庫
create controlfile reused --創建新控制文件
database "orcl"
logfile
group 1 'D:\PROGRAM\ORACLE\ORADATA\ORCL\REDO01.LOG',
group 2 'D:\PROGRAM\ORACLE\ORADATA\ORCL\REDO02.LOG',
group 3 'D:\PROGRAM\ORACLE\ORADATA\ORCL\REDO03.LOG'
datafile
'D:\PROGRAM\ORACLE\ORADATA\ORCL\SYSTEM01.DBF',
'D:\PROGRAM\ORACLE\ORADATA\ORCL\SYSAUX01.DBF',
'D:\PROGRAM\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF',
'D:\PROGRAM\ORACLE\ORADATA\ORCL\USERS01.DBF',
'D:\PROGRAM\ORACLE\ORADATA\ORCL\EXAMPLE01.DBF',
'D:\PROGRAM\ORACLE\PRODUCT\11.2.0\DBHOME_1\ORADATA\KPLAYER\KPLAYER.DBF'
maxlogfiles 50
maxlogmembers 3
maxinstances 6
maxdatafiles 200
noresetlogs
noarchivelog;
alter system set control_files=? --編輯參數
? 'E:\PROG\ADMIN\ORADATA\ORCL\CONTROL01.CTL',
? 'E:\PROG\ADMIN\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL'
scope=spfile;
alter database open;? --打開數據庫 [resetlogs]
---備份
alter database backup controlfile
to 'D:\OracleFiles\ControlFiles\ctf.bak';? --二進制文件
alter database backup controlfile to trace;? --腳本文件
show parameter user_dump_dest;
---恢復
--關閉->復制覆蓋->重啟
--關閉->編輯CONTROL_FILES->重啟
---刪除
--關閉->編輯CONTROL_FILES->重啟
---查詢
--v$controlfile? 所有控制文件名稱和狀態
--v$controlfile_record_section? 控制文件各記錄文檔段信息
--v$parameter? 系統所有初始化參數
------4.3 重做日志文件
---增加
alter database add logfile group 5
('D:\OracleFiles\LogFiles\REDO4_A.LOG',
'E:\OracleFiles\LogFiles\REDO4_B.LOG')
size 20M;? --添加新的重做日志文件組
alter database add logfile member
'E:\OracleFiles\LogFiles\REDO4_C.LOG' to group 4;? --創建日志成員文件
alter database add logfile member
'D:\OracleFiles\LogFiles\REDO1_new.LOG' to
('E:\app\Administrator\oradata\orcl\REDO01.LOG') ;? --指定成員名稱
---刪除
--日志成員
alter database drop logfile member 'E:\OracleFiles\LogFiles\REDO4_C.LOG';
--日志文件組
alter database drop logfile group 5;
--清空
alter database clear logfile group 4;
---更改
--關閉->復制源文件到目標位置->啟動加載但不打開mount
alter database rename file
? 'D:\OracleFiles\LogFiles\REDO1_new.LOG',
? 'D:\OracleFiles\LogFiles\REDO4_A.LOG'
to
? 'E:\OracleFiles\LogFiles\REDO1_new.LOG',
? 'E:\OracleFiles\LogFiles\REDO4_A.LOG';
--打開數據庫
--查看
--v$log v$logfile v$log_history
------4.4 歸檔日志文件
---切換
select log_mode from v$database;? --noarchivelog/archivelog
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
---進程
alter system set log_archive_max_processes = 3;
---位置
--本地
alter system set log_archive_dest_1='location=D:\OracleFiles\archive1 optional';
alter system set log_archive_dest_2='location=D:\OracleFiles\archive2 mandatory';
alter system set log_archive_dest_3='location=D:\OracleFiles\archive3 mandatory reopen=400';
alter system set log_archive_min_succeed_dest=3;? --最小歸檔數
alter system set log_archive_dest_state_4=defer;? --禁用位置
--遠程
alter system set log_archive_dest_1='service=MRKJ';
---查看
--v$database v$archived_log v$archive_dest v$archive_processes v$backup_redolog
archive log list;
----------5. 數據庫維護-------------
------5.1 數據庫控制
---事務
set transaction read only;? --read write
exec dbms_transaction.read_only;
set transaction use rollback segment system;? --分配回滾段
savepoint sp01;? --設置保存點
insert into jobs_temp values('DESIGN','DS',3000,5000);
rollback to sp01;? --回滾
---鎖
lock table dept_temp in row share mode;
--row exclusive mode/share mode/share row exclusive mode/exclusive mode
------5.2 數據導入/導出
---導出
create directory dump_dir as 'd:\dump';
grant read,write on directory dump_dir to scott;
--表
expdp scott/1qaz2wsx directory = dump_dir dumpfile=tab.dmp tables=emp,dept
--模式
expdp system/1qaz2wsx directory = dump_dir dumpfile=schema.dmp schemas=scott,hr
--表空間
expdp system/1qaz2wsx directory = dump_dir dumpfile = tablespace.dmp tablespaces=tbsp_1
--數據庫
expdp system/1qaz2wsx directory=dump_dir dumpfile=fulldatabase.dmp full=y
--content/query/logfile/status
---導入
impdp system/1qaz2wsx directory=dump_dir dumpfile=tab.dmp tables=scott.dept,scott.emp remap_schema=scott:system? --表
impdp system/1qaz2wsx directory=dump_dir dumpfile=schema.dmp schemas=scott remap_schema=scott:system;? --模式
impdp system/1qaz2wsx directory=dump_dir dumpfile=tablespace.dmp tablespaces=tbsp_1? --表空間
impdp system/1qaz2wsx directory=dump_dir dumpfile=fulldatabase.dmp full=y? --數據庫
--remap_schema/remap_tablesapce/sqlfile/table_exists_action/transport_datafiles
------SQL Loader
sqlldr --用法
---自由格式
/*? --student.ctl
load data
? infile 'd:\data\student.txt'
? into table student
? (stuno position(01:04) integer external,
? stuname position(11:14) char,
? sex position(21:22) char,
? old position(29:30) integer external
? )
*/
sqlldr system/1qaz2wsx control=d:\data\student.ctl log=d:\data\stu_log
---固定格式
/*? --persons.ctl
load data
infile 'd:\data\persons.csv'
append into table persons
fields terminated by ','
(code,name,sex,old)
*/
sqlldr system/1qaz2wsx control=d:\data\persons.ctl
------6.0? 數據庫對象
---6.1 游標
一、游標概述
游標(cursor)是數據庫系統在內存中開設的一個數據緩沖區,存放SQL語句的執行結果。
每個游標都有一個名字,用戶可以用SQL語句逐一從游標中獲取記錄,并賦給變量做進一步處理。
作用:用于定位結果集的行 和 遍歷結果集。
游標產生時間:當執行DML SQL語句時;
游標用于存放:結果集
游標有名字嗎:有,SQL或用戶給他取名
游標如何操作:用FETCH語句逐一從游標中提取記錄,并賦給變量進一步處理
同時可打開幾個游標:多個,具體數量由數據庫初始化參數OPEN_CURSOR決定。
二、游標分類
游標分為:靜態游標(隱式和顯式)和REF游標(+游標變量)
1. 游標的屬性
--顯式游標
游標的屬性? 返回值類型? ? ? ? ? ? ? 意? ? 義
%ROWCOUNT? ? ? 整型? ? ? ? ? 獲得FETCH語句返回的數據行數
%FOUND? ? ? ? 布爾型? ? ? ? 最近的FETCH語句返回一行數據則為真,否則為假
%NOTFOUND? ? 布爾型? ? ? ? 與%FOUND屬性返回值相反
%ISOPEN? ? ? 布爾型? ? ? ? 游標已經打開時值為真,否則為假
2. 靜態游標
靜態游標是指結果集已經確實(靜態定義)的游標。
靜態游標分:隱式游標 和 顯示游標。
2.1 隱式游標
在PL/SQL中隱式游標在執行DML SQL(Insert/Delete/Update/Select)語句時自動創建、自動聲明、打開和關閉,其名SQL(注:所有的隱式游標名都叫“SQL”);
隱式游標的屬性 返回值類型? ? 意? ? 義
SQL%ROWCOUNT? ? 整型? ? ? ? 代表DML語句成功執行的數據行數
SQL%FOUND? ? ? 布爾型? ? ? 值為TRUE代表插入、刪除、更新或單行查詢操作成功
SQL%NOTFOUND? ? 布爾型? ? ? 與SQL%FOUND屬性返回值相反
SQL%ISOPEN? ? ? 布爾型? ? ? DML執行過程中為真,結束后為假
示例:
使用隱式游標的屬性。
BEGIN
UPDATE emp SET sal=5000 WHERE empno=7369;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('表已更新');
COMMIT;
ELSE
DBMS_OUTPUT.PUT_LINE('更新失敗');
END IF;
END;
------------------------------------------
declare
? cursor c_name(cust_name varchar) is
? ? select * from YXD.ZJZB_N_20180131_03 where 客戶名 = cust_name;
? Cust_Nm YXD.ZJZB_N_20180131_03%ROWTYPE;
BEGIN
FOR i in c_name('王東生') LOOP
? ? DBMS_OUTPUT.put_line(i.客戶名||','||i.行業板塊);
? END LOOP;
END;
------------------------------------------
--1.不帶參的游標
--查詢每個人的薪水
declare
? --定義光標(游標)
? cursor cemp is select ename,sal from emp;
? pename emp.ename%type;
? psal? emp.sal%type;
begin
? --打開游標
? open cemp;
? loop
? ? ? --取當前記錄
? ? ? fetch cemp into pename,psal;
? ? ? --exit when 沒有取到記錄;
? ? ? exit when cemp%notfound;
? ? ? dbms_output.put_line(pename||'的薪水是'||psal);
? end loop;
? --關閉游標
? close cemp;
end;
/
--2. 帶參的游標
--查詢某個部門的員工姓名
declare
? --形參(定義)
? cursor cemp(dno number) is select ename from emp where deptno=dno;
? pename emp.ename%type;
begin
? --實參
? open cemp(20);--傳入參數,打開游標部門號為20
? dbms_output.put_line('該部門的員工有:');
? loop
? ? ? ? fetch cemp into pename;
? ? ? ? exit when cemp%notfound;? ? ?
? ? ? ? dbms_output.put_line(pename);
? end loop;
? close cemp;
end;
/
----------------------------------------------------------------------
--6.2 事務(TRANSACTION)
---6.2.1 什么是事務?
在數據庫中事務是工作的邏輯單元,一個事務是由一個或多個完成一組的相關行為的SQL語句組成,通過事務機制確保這一組SQL語句所作的操作要么都成功執行,完成整個工作單元操作,要么一個也不執行。
如:網上轉帳就是典型的要用事務來處理,用以保證數據的一致性。
--6.2.2 事務特性
原子性(Atomicity):一個事務里面所有包含的SQL語句是一個執行整體,不可分割,要么都做,要么都不做。
一致性(Consistency):事務開始時,數據庫中的數據是一致的,事務結束時,數據庫的數據也應該是一致的。
隔離性(Isolation):是指數據庫允許多個并發事務同時對其中的數據進行讀寫和修改的能力,隔離性可以防止事務的并發執行時,由于他們的操作命令交叉執行而導致的數據不一致狀態。
持久性 (Durability) : 是指當事務結束后,它對數據庫中的影響是永久的,即便系統遇到故障的情況下,數據也不會丟失。
--6.2.3 數據異常
因為Oracle中支持多個事務并發執行,所以會出現下面的數據異常。
? ? --6.2.3.1 臟讀
當一個事務修改數據時,另一事務讀取了該數據,但是第一個事務由于某種原因取消對數據修改,使數據返回了原狀態,這是第二個事務讀取的數據與數據庫中數據不一致,這就叫臟讀。
? ? 如:事務T1修改了一條數據,但是還未提交,事務T2恰好讀取到了這條修改后了的數據,此時T1將事務回滾,這個時候T2讀取到的數據就是臟數據。
--6.2.3.2 不可重復讀
是指一個事務讀取數據庫中的數據后,另一個事務則更新了數據,當第一個事務再次讀取其中的數據時,就會發現數據已經發生了改變,這就是不可重復讀取。不可重復讀取所導致的結果就是一個事務前后兩次讀取的數據不相同。
? ? 如:事務T1讀取一行記錄,緊接著事務T2修改了T1剛剛讀取的記錄,然后T1再次查詢,發現與第一次讀取的記錄不同。
--6.2.3.3 幻讀
如果一個事務基于某個條件讀取數據后,另一個事務則更新了同一個表中的數據,這時第一個事務再次讀取數據時,根據搜索的條件返回了不同的行,這就是幻讀。
? ? 如:事務T1讀取一條指定where條件的語句,返回結果集。此時事務T2插入一行新記錄,恰好滿足T1的where條件。然后T1使用相同的條件再次查詢,結果集中可以看到T2插入的記錄,這條新紀錄就是幻讀。
事務中遇到的這些異常與事務的隔離性設置有關,事務的隔離性設置越多,異常就出現的越少,但并發效果就越低,事務的隔離性設置越少,異常出現的越多,并發效果越高。
--6.2.4 事務隔離級別
針對讀取數據時可能產生的不一致現象,在SQL92標準中定義了4個事務的隔離級別:
? ? ? 隔離級別 ? ? ? ? ? ? ? ? ? 臟讀? 不可重復讀 幻讀
Read uncommitted(讀未提交) ? ? ? 是 ? 是 ? ? 是
Read committed(讀已提交) ? ? ? 否 ? 是 ? ? 是
Repeatable read(可重復讀) ? ? ? 否 ? 否 ? ? 是
Serializable(串行讀) ? ? ? ? ? 否 ? 否 ? ? 否
Oracle默認的隔離級別是read committed。
Oracle支持上述四種隔離級別中的兩種:read committed 和serializable。除此之外,Oralce中還定義Read only和Read write隔離級別。
Read only:事務中不能有任何修改數據庫中數據的操作語句,是Serializable的一個子集。
Read write:它是默認設置,該選項表示在事務中可以有訪問語句、修改語句,但不經常使用。
設置隔離級別
設置一個事務的隔離級別:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ ONLY;
SET TRANSACTION READ WRITE;
set transaction read write;
注意:這些語句是互斥的,不能同時設置兩個或兩個以上的選項。
設置單個會話的隔離級別:
ALTER SESSION SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
ALTER SESSION SET TRANSACTION ISOLATION SERIALIZABLE;
-------------------------------------------------------------------------------------
--------------------------------銀行轉賬業務流程事務---------------------------------
-------------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE BANK_TRANSFER_TRANSACTION(
? I_MONEY IN NUMBER,--輸入參數,轉賬金額
? I_OUT_ACCOUNT IN INTEGER,--輸入參數,轉出賬戶
? I_IN_ACCOUNT IN INTEGER, --輸入參數,轉入賬號
? V_BALANCE OUT account.balance%TYPE--輸出參數,返回當前賬戶余額
? ) IS
--從一個賬戶向另一個賬戶轉賬
BEGIN
? --從轉出賬戶扣錢
? UPDATE account set balance = balance - I_MONEY WHERE ID=I_OUT_ACCOUNT;
? select balance into V_BALANCE from account where ID=I_OUT_ACCOUNT;
? IF SQL%NOTFOUND THEN
? ? RAISE_APPLICATION_ERROR(-20001,'對不起,沒有該賬戶,可能未開戶:'||40000000000);
? END IF;
? IF V_BALANCE<0 THEN
? ? RAISE_APPLICATION_ERROR(-20002,'賬戶余額不足!');
? END IF;
? --向轉入賬戶加錢
? UPDATE account set balance=balance + I_MONEY WHERE ID=I_IN_ACCOUNT;
? IF SQL%NOTFOUND THEN
? ? RAISE_APPLICATION_ERROR(-20001,'對不起,沒有該賬戶:'||I_IN_ACCOUNT);
? END IF;
? -- 如果沒有異常,則提交事務
? COMMIT;
? DBMS_OUTPUT.PUT_LINE('轉賬成功!'||'當前可用余額為:'||V_BALANCE);
? EXCEPTION
? ? WHEN OTHERS THEN
? ? ? ROLLBACK; -- 出現異常則回滾事務
? ? ? DBMS_OUTPUT.PUT_LINE('轉賬失敗:');
? ? ? DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
--6.3? 存儲過程中的自治事務(PRAGMA AUTONOMOUS_TRANSACTION)
定義:PRAGMA AUTONOMOUS_TRANSACTION中文翻譯過來叫“自治事務”(翻譯的還算好理解),
? ? ? 對于定義成自治事務的Procedure,實際上相當于一段獨立運行的程序段,這段程序不依賴于主程序,也不干涉主程序。
特點:
? ? 第一,這段程序不依賴于原有Main程序,比如Main程序中有未提交的數據,那么在自治事務中是查找不到的。
? ? 第二,在自治事務中,commit或者rollback只會提交或回滾當前自治事務中的DML,不會影響到Main程序中的DML。
------------------------------------------------------
------------------專題-ORACLE連續值問題 ----------------------
? ? ? ? ? ? ? ? --常見于并列排名等情況--
-----------------------------------------------------
--現有需求,找出這組數據中的連續中斷后的最小值和最大值
name num
A? ? 1
A? ? 2
A? ? 4
B? ? 5
B? ? 7
B? ? 8
C? ? 9
C? ? 11
----------------------------------------------------
創建測試表:
create table test
(name varchar2(1),
num int);
insert into test values ('A',1);
insert into test values ('A',2);
insert into test values ('A',4);
insert into test values ('B',5);
insert into test values ('B',7);
insert into test values ('B',8);
insert into test values ('C',9);
insert into test values ('C',11);
commit;
執行結果:
with t as
(select name,
? ? ? ? num,
? ? ? ? row_number() over(partition by name order by num desc) rn
? ? from test)
select s.name, s.num
? from (select t2.*
? ? ? ? ? from t t1, t t2
? ? ? ? where t1.rn = t2.rn - 1
? ? ? ? ? and t1.num = t2.num + 1
? ? ? ? ? and t1.rn = 1
? ? ? ? union all
? ? ? ? select * from t where rn = 1) s
order by name, num
------------------------------------------------------------------
---------------------正則表達式-----------------------------------
------------------------------------------------------------------
SQL語句還可以搭配正則表達式作為查詢條件,很是有用。
REGEXP_LIKE(匹配)
REGEXP_INSTR (包含)
REGEXP_REPLACE(替換)
REGEXP_SUBSTR(提取)
--***************--------------------
-- 表 1:定位元字符(常在notepad++中用到)
元字符 ? ? ? ? ? ? ? 說明
^ ? ? ? ? ? ? 使表達式定位至一行的開頭
$ ? ? ? ? ? ? 使表達式定位至一行的末尾
-- 表 2:量詞或重復操作符
量詞 ? ? ? ? ? ? ? 說明
* ? ? ? ? ? ? 匹配 0 次或更多次
? ? ? ? ? ? ? 匹配 0 次或 1 次
+ ? ? ? ? ? ? 匹配 1 次或更多次
{m} ? ? ? ? ? ? 正好匹配 m 次
{m,} ? ? ? ? 至少匹配 m 次
{m, n} ? ? ? ? 至少匹配 m 次但不超過 n 次
-- 表 3:預定義的 POSIX 字符類
字符類 ? ? ? ? ? ? ? 說明
[:alpha:] ? ? 字母字符
[:lower:] ? ? 小寫字母字符
[:upper:] ? ? 大寫字母字符
[:digit:] ? ? 數字
[:alnum:] ? ? 字母數字字符
[:space:] ? ? 空白字符(禁止打印),如回車符、換行符、豎直制表符和換頁符
[:punct:] ? ? 標點字符
[:cntrl:] ? ? 控制字符(禁止打印)
[:print:] ? ? 可打印字符
-- 表 4:表達式的替換匹配和分組
元字符 ? ? ? ? ? ? ? 說明
|替換 ? ? ? ? 分隔替換選項,通常與分組操作符 () 一起使用
( )分組 ? ? ? ? 將子表達式分組為一個替換單元、量詞單元或后向引用單元(參見“后向引用”部分)
[char]字符列表 表示一個字符列表;一個字符列表中的大多數元字符(除字符類、^ 和 - 元字符之外)被理解為文字
-- 表 5:REGEXP_LIKE 操作符
語法:REGEXP_LIKE(source_string, pattern[, match_parameter])
說明:source_string 支持字符數據類型(CHAR、VARCHAR2、CLOB、NCHAR、NVARCHAR2 和 NCLOB,但不包括 LONG)。
? ? ? pattern 參數是正則表達式的另一個名稱。
? match_parameter 允許可選的參數(如處理換行符、保留多行格式化以及提供對區分大小寫的控制)。
-- 表 6:REGEXP_SUBSTR 操作符
語法:regexp_substr(source_string,pattern[,position[,occurrence[,match_parameter]]])
說明:? source_string:源串,可以是常量,也可以是某個值類型為串的列
? position:從源串開始搜索的位置。默認為1。
? occurrence:指定源串中的第幾次出現。默認值1.
? match_parameter:文本量,進一步訂制搜索,取值如下:
? ? 'i'? ? 用于不區分大小寫的匹配。
? ? 'c'? ? 用于區分大小寫的匹配。
? ? 'n'? ? 允許將句點“.”作為通配符來匹配換行符。如果省略改參數,句點將不匹配換行符。
? ? 'm'? 將源串視為多行。即將“^”和“$”分別看做源串中任意位置任意行的開始和結束,而不是看作整個源串的開始或結束。如果省略該參數,源串將被看作一行來處理。
? ? 如果取值不屬于上述中的某個,將會報錯。如果指定了多個互相矛盾的值,將使用最后一個值。如'ic'會被當做'c'處理。
? ? 省略該參數時:默認區分大小寫、句點不匹配換行符、源串被看作一行。
案例:
? ? select regexp_substr('MY INFO: Anxpp,22,and boy','my',1,1,'i') from users;
? ? 將返回MY,如果將match_parameter改為'c'將不反悔任何內容(null)||
-- 表 7:REGEXP_INSTR 操作符
語法:REGEXP_INSTR(source_string, pattern[, start_position[, occurrence[, return_option[, match_parameter]]]])
說明:該函數查找 pattern ,并返回該模式的第一個位置。您可以隨意指定您想要開始搜索的 start_position。 occurrence 參數默認為 1,除非您指定您要查找接下來出現的一個模式。
? ? ? return_option 的默認值為 0,它返回該模式的起始位置;值為 1 則返回符合匹配條件的下一個字符的起始位置。
-- 表 8:REGEXP_REPLACE 操作符
語法:REGEXP_REPLACE(source_string, pattern[, replace_string [, position[,occurrence, [match_parameter]]]])
說明:該函數用一個指定的 replace_string 來替換匹配的模式,從而允許復雜的“搜索并替換”操作。
--表 9:后向引用元字符
元字符 ? ? ? ? ? 說明
\digit 反斜線 緊跟著一個 1 到 9 之間的數字,反斜線匹配之前的用括號括起來的第 digit 個子表達式。
(注意:反斜線在正則表達式中有另一種意義,取決于上下文,它還可能表示 Escape 字符。
2.32萬/s *60*60=8352*24=2.00448億
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
用戶名正則(--4到16位(字母,數字,下劃線,減號--)
var uPattern = /^[a-zA-Z0-9_-]{4,16}$/;
console.log(uPattern.test("iFat3"));
密碼強度正則(--//密碼強度正則,最少6位,包括至少1個大寫字母,1個小寫字母,1個數字,1個特殊字符--)
var pPattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*?]).*$/;
console.log("該密碼符合要求"+pPattern.test("iFat3#"));
整數正則
? ? //正整數正則
? ? ? var posPattern = /^\d+$/;
? ? //負整數正則
? var negPattern = /^-\d+$/;
? ? //整數正則
? ? ? var intPattern = /^-?\d+$/;
數字正則(整數或浮點)
? ? //正數正則
? ? ? var posPattern = /^\d*\.?\d+$/;
? ? //負數正則
? ? ? var negPattern = /^-\d*\.?\d+$/;
? ? //數字正則
? var numPattern = /^-?\d*\.?\d+$/;
Email正則
var ePattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
console.log(ePattern.test("65974040@qq.com"));
手機號正則
var mPattern = /^1[3456789]\d{9}$/;
console.log(mPattern.test("18516370162"));
身份證正則
var card = /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
console.log(card.test("4123445565656657565"));
--------------------------------------------------------------------
------------------------專題-ORACLE行轉列的幾種方式 ----------------
--------------------------------------------------------------------
--行轉列的幾種方式
--1. pivot
with temp as(
select '四川省' nation ,'成都市' city,'第一' ranking from dual union all
select '四川省' nation ,'綿陽市' city,'第二' ranking from dual union all
select '四川省' nation ,'德陽市' city,'第三' ranking from dual union all
select '四川省' nation ,'宜賓市' city,'第四' ranking from dual union all
select '湖北省' nation ,'武漢市' city,'第一' ranking from dual union all
select '湖北省' nation ,'宜昌市' city,'第二' ranking from dual union all
select '湖北省' nation ,'襄陽市' city,'第三' ranking from dual
)
select * from (select nation,city,ranking from temp)pivot (max(city) for ranking in ('第一' as 第一,'第二' AS 第二,'第三' AS 第三,'第四' AS 第四));
*說明:pivot(聚合函數 for 列名 in(類型)),其中 in(‘’) 中可以指定別名,in中還可以指定子查詢,比如 select distinct ranking from temp*
常用的分析函數如下所列:
row_number() over(partition by ... order by ...)
rank() over(partition by ... order by ...)
dense_rank() over(partition by ... order by ...)
count() over(partition by ... order by ...)
max() over(partition by ... order by ...)
min() over(partition by ... order by ...)
sum() over(partition by ... order by ...)
avg() over(partition by ... order by ...)
first_value() over(partition by ... order by ...)
last_value() over(partition by ... order by ...)
lag() over(partition by ... order by ...)
lead() over(partition by ... order by ...)
------------------------------------------------------
------------DBMS_JOB 作業(定時器) ------------
------------------------------------------------------
一、dbms_job涉及到的知識點
1、創建job:(需在命令行窗口執行)
variable jobno number;
dbms_job.submit(:jobno, --job號,系統默認隨機賦值
'過程名(parameter);',--執行的存儲過程, ';'不能省略 ,如果入參傳有字符串則需用雙單引號(''parameter'')
next_date, --下次執行時間
'interval' --每次間隔時間,interval以天為單位
);
2、刪除job: dbms_job.remove(jobno);
3、修改要執行的操作: job:dbms_job.what(jobno, what);
4、修改下次執行時間:dbms_job.next_date(jobno, next_date);
5、修改間隔時間:dbms_job.interval(jobno, interval);
6、啟動job: dbms_job.run(jobno);
7、停止job: dbms.broken(jobno, broken, nextdate); --broken為boolean值
二、初始化相關參數job_queue_processes
1、job_queue_process表示oracle能夠并發的job的數量,當job_queue_process值為0時表示全部停止oracle的job。
2、查看job_queue_processes參數
方法一:
show parameter job_queue_process;
方法二:
select * from v$parameter where name='job_queue_processes';
3、修改job_queue_processes參數
alter system set job_queue_processes = 10;
三、user_jobs表結構
字段(列) 類型 描述
job number 任務的唯一標示號
log_user varchar2(30) 提交任務的用戶
priv_user varchar2(30) 賦予任務權限的用戶
schema_user varchar2(30) 對任務作語法分析的用戶模式
last_date date 最后一次成功運行任務的時間
last_sec varchar2(8) 如hh24:mm:ss格式的last_date日期的小時,分鐘和秒
this_date date 正在運行任務的開始時間,如果沒有運行任務則為null
this_sec varchar2(8) 如hh24:mm:ss格式的this_date日期的小時,分鐘和秒
next_date date 下一次定時運行任務的時間
以下使用一個案例來演示dbms_job的使用
一、在plsql中創建表:
create table t(
id varchar2(30),
name varchar2(30)
);
二、在plsql中創建存儲過程:
create or replace procedure proce_t is
begin
insert into t(id, name) values('1', to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'));
commit;
end proce_t;
/
三、創建job任務(1分鐘執行一次):
在sql>后執行:
variable jobno number;
begin
dbms_job.submit(:jobno,'proce_t;', sysdate, 'sysdate+1/24/60');
commit;
end;
/
提交后提示:
pl/sql procedure successfully completed
jobno
---------
25
四、跟蹤任務的情況(查看任務隊列):
sql> select job, next_date, next_sec, failures, broken from user_jobs;
job next_date next_sec failures broken
---------- ----------- ---------------- ---------- --------
25 2012/9/14 1 10:59:46 0 n
說明任務已創建成功。
執行select * from t;查看定時任務的結果。可以看出定時任務是正常執行了的。
五、停止定時任務
1、查看定時任務的job號。
sql> select job, next_date, next_sec, failures, broken from user_jobs;
job next_date next_sec failures broken
---------- ----------- ---------------- ---------- ------
25 2012/9/14 1 11:01:48 0 n
2、停止一個已啟動的定時任務:
begin
dbms_job.broken(25, true, sysdate);
commit;
end;
/
表示停止job為25的任務。
執行后顯示如下:
pl/sql procedure successfully completed
3、查看定時任務是否已停止成功
sql> select job, next_date, next_sec, failures, broken from user_jobs;
job next_date next_sec failures broken
---------- ----------- ---------------- ---------- ------
25 4000/1/1 00:00:00 0 y
broken值為y,表示定時任務已停止。
六、啟動定時任務
1、查看停止定時任務
sql> select job, next_date, next_sec, failures, broken from user_jobs;
job next_date next_sec failures broken
---------- ----------- ---------------- ---------- ------
25 4000/1/1 00:00:00 0 y
broken值為y,表示定時任務已停止。
2、啟動定時任務
begin
dbms_job.run(25);
commit;
end;
/
3、查看定時任務是否已啟動
sql> select job, next_date, next_sec, failures, broken from user_jobs;
job next_date next_sec failures broken
---------- ----------- ---------------- ---------- ------
25 2012/9/14 1 11:06:17 0 n
broken值為n,表示定時任務啟動成功。
七、查看進程數
show parameter job_queue_processes;
必須大于0,否則執行下面的命令修改:
alter system set job_queue_processes=10;
八、再創建一個任務(每5分鐘執行一次):
variable jobno number;
begin
dbms_job.submit(:jobno, 'proce_t;', sysdate, 'sysdate+1/24/12'); --interval是以天為單位的
commit;
end;
/
九、 執行
select job,next_date,next_sec,failures,broken from user_jobs;
結果:
sql> select job,next_date,next_sec,failures,broken from user_jobs;
job next_date next_sec failures broken
---------- ----------- ---------------- ---------- ------
26 2012/9/14 1 11:12:08 0 n
25 2012/9/14 1 11:07:18 0 n
十、總結
關于job運行時間
1:每分鐘執行
Interval => TRUNC(sysdate,'mi') + 1/(24*60)
2:每天定時執行
例如:每天的凌晨1點執行
Interval => TRUNC(sysdate) + 1 +1/(24)
3:每周定時執行
例如:每周一凌晨1點執行
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24
4:每月定時執行
例如:每月1日凌晨1點執行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24
5:每季度定時執行
例如每季度的第一天凌晨1點執行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
6:每半年定時執行
例如:每年7月1日和1月1日凌晨1點
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
7:每年定時執行
例如:每年1月1日凌晨1點執行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'), 12)+1/24
job的運行頻率設置
1.每天固定時間運行,比如早上8:10分鐘:Trunc(Sysdate+1) + (8*60+10)/24*60
2.Toad中提供的:
每天:trunc(sysdate+1)
每周:trunc(sysdate+7)
每月:trunc(sysdate+30)
每個星期日:next_day(trunc(sysdate),'星期日')
每天6點:trunc(sysdate+1)+6/24
半個小時:sysdate+30/(24*60)
3.每個小時的第15分鐘運行,比如:8:15,9:15,10:15…:trunc(sysdate,'hh')+(60+15)/(24*60) 。
--------------------------------------------------