發(fā)表時(shí)間:2010-03-02   最后修改:2010-05-25
 
首先,以超級(jí)管理員的身份登錄oracle
	sqlplus sys/bjsxt as sysdba

然后,解除對(duì)scott用戶的鎖
	alter user scott account unlock;
那么這個(gè)用戶名就能使用了。
(默認(rèn)全局?jǐn)?shù)據(jù)庫(kù)名orcl)

1、select ename, sal * 12 from emp; //計(jì)算年薪
2、select 2*3 from dual;  //計(jì)算一個(gè)比較純的數(shù)據(jù)用dual表
3、select sysdate from dual;  //查看當(dāng)前的系統(tǒng)時(shí)間
4、select ename, sal*12 anuual_sal from emp; //給搜索字段更改名稱(雙引號(hào) keepFormat 別名有特殊字符,要加雙引號(hào))。
5、任何含有空值的數(shù)學(xué)表達(dá)式,最后的計(jì)算結(jié)果都是空值。
6、select ename||sal from emp;  //(將sal的查詢結(jié)果轉(zhuǎn)化為字符串,與ename連接到一起,相當(dāng)于Java中的字符串連接)
7、select ename||'afasjkj' from emp;   //字符串的連接
8、select distinct deptno from emp;   //消除deptno字段重復(fù)的值
9、select distinct deptno , job from emp; //將與這兩個(gè)字段都重復(fù)的值去掉
10、select * from emp where deptno=10;   //(條件過(guò)濾查詢)
11、select * from emp where empno > 10;  //大于 過(guò)濾判斷
12、select * from emp where empno <> 10  //不等于  過(guò)濾判斷
13、select * from emp where ename > 'cba';  //字符串比較,實(shí)際上比較的是每個(gè)字符的AscII值,與在Java中字符串的比較是一樣的
14、select ename, sal from emp where sal between 800 and 1500;  //(between and過(guò)濾,包含800 1500)
15、select ename, sal, comm from emp where comm is null;  //(選擇comm字段為null的數(shù)據(jù))
16、select ename, sal, comm from emp where comm is not null;  //(選擇comm字段不為null的數(shù)據(jù))
17、select ename, sal, comm from emp where sal in (800, 1500,2000);  //(in 表范圍)
18、select ename, sal, hiredate from emp where hiredate > '02-2月-1981'; //(只能按照規(guī)定的格式寫(xiě))
19、select ename, sal from emp where deptno =10 or sal >1000;
20、select ename, sal from emp where deptno =10 and sal >1000;
21、select ename, sal, comm from emp where sal not in (800, 1500,2000);  //(可以對(duì)in指定的條件進(jìn)行取反)
22、select ename from emp where ename like '%ALL%';   //(模糊查詢)
23、select ename from emp where ename like '_A%';    //(取第二個(gè)字母是A的所有字段)
24、select ename from emp where ename like '%/%%';   //(用轉(zhuǎn)義字符/查詢字段中本身就帶%字段的)
25、select ename from emp where ename like '%$%%' escape '$';   //(用轉(zhuǎn)義字符/查詢字段中本身就帶%字段的)
26、select * from dept order by deptno desc; (使用order by  desc字段 對(duì)數(shù)據(jù)進(jìn)行降序排列 默認(rèn)為升序asc);
27、select * from dept where deptno <>10 order by deptno asc;   //(我們可以將過(guò)濾以后的數(shù)據(jù)再進(jìn)行排序)  
28、select ename, sal, deptno from emp order by deptno asc, ename desc;   //(按照多個(gè)字段排序 首先按照deptno升序排列,當(dāng)detpno相同時(shí),內(nèi)部再按照ename的降序排列)
29、select lower(ename) from emp;  //(函數(shù)lower() 將ename搜索出來(lái)后全部轉(zhuǎn)化為小寫(xiě));
30、select ename from emp where lower(ename) like '_a%';  //(首先將所搜索字段轉(zhuǎn)化為小寫(xiě),然后判斷第二個(gè)字母是不是a)
31、select substr(ename, 2, 3) from emp;    //(使用函數(shù)substr() 將搜素出來(lái)的ename字段從第二個(gè)字母開(kāi)始截,一共截3個(gè)字符)
32、select chr(65) from dual;  //(函數(shù)chr() 將數(shù)字轉(zhuǎn)化為AscII中相對(duì)應(yīng)的字符) 
33、select ascii('A') from dual;  //(函數(shù)ascii()與32中的chr()函數(shù)是相反的 將相應(yīng)的字符轉(zhuǎn)化為相應(yīng)的Ascii編碼)                                                                                                                                                                                                                                                                                                                                             )
34、select round(23.232) from dual;  //(函數(shù)round() 進(jìn)行四舍五入操作)
35、select round(23.232, 2) from dual;  //(四舍五入后保留的小數(shù)位數(shù) 0 個(gè)位 -1 十位)
36、select to_char(sal, '$99,999.9999')from emp;  //(加$符號(hào)加入千位分隔符,保留四位小數(shù),沒(méi)有的補(bǔ)零)
37、select to_char(sal, 'L99,999.9999')from emp;  //(L 將貨幣轉(zhuǎn)化為本地幣種此處將顯示¥人民幣)
38、select to_char(sal, 'L00,000.0000')from emp;  //(補(bǔ)零位數(shù)不一樣,可到數(shù)據(jù)庫(kù)執(zhí)行查看)
39、select to_char(hiredate, 'yyyy-MM-DD HH:MI:SS') from emp;  //(改變?nèi)掌谀J(rèn)的顯示格式)
40、select to_char(sysdate, 'yyyy-MM-DD HH:MI:SS') from dual;  //(用12小時(shí)制顯示當(dāng)前的系統(tǒng)時(shí)間)
41、select to_char(sysdate, 'yyyy-MM-DD HH24:MI:SS') from dual;  //(用24小時(shí)制顯示當(dāng)前的系統(tǒng)時(shí)間)
42、select ename, hiredate from emp where hiredate > to_date('1981-2-20 12:24:45','YYYY-MM-DD HH24:MI:SS');   //(函數(shù)to-date 查詢公司在所給時(shí)間以后入職的人員)
43、select sal from emp where sal > to_number('$1,250.00', '$9,999.99');   //(函數(shù)to_number()求出這種薪水里帶有特殊符號(hào)的)
44、select ename, sal*12 +  nvl(comm,0) from emp;   //(函數(shù)nvl() 求出員工的"年薪 + 提成(或獎(jiǎng)金)問(wèn)題")
45、select max(sal) from emp;  // (函數(shù)max() 求出emp表中sal字段的最大值)
46、select min(sal) from emp;  // (函數(shù)max() 求出emp表中sal字段的最小值)
47、select avg(sal) from emp;  //(avg()求平均薪水);
48、select to_char(avg(sal), '999999.99') from emp;   //(將求出來(lái)的平均薪水只保留2位小數(shù))
49、select round(avg(sal), 2) from emp;  //(將平均薪水四舍五入到小數(shù)點(diǎn)后2位)
50、select sum(sal) from emp;  //(求出每個(gè)月要支付的總薪水)

/////////////////////////組函數(shù)(共5個(gè)):將多個(gè)條件組合到一起最后只產(chǎn)生一個(gè)數(shù)據(jù)//////min() max() avg() sum() count()/////////////////////////////
51、select count(*) from emp;  //求出表中一共有多少條記錄
52、select count(*) from emp where deptno=10;  //再要求一共有多少條記錄的時(shí)候,還可以在后面跟上限定條件
53、select count(distinct deptno) from emp;   //統(tǒng)計(jì)部門編號(hào)前提是去掉重復(fù)的值
////////////////////////聚組函數(shù)group by() //////////////////////////////////////
54、select deptno, avg(sal) from emp group by deptno;  //按照deptno分組,查看每個(gè)部門的平均工資
55、select max(sal) from emp group by deptno, job; //分組的時(shí)候,還可以按照多個(gè)字段進(jìn)行分組,兩個(gè)字段不相同的為一組
56、select ename from emp where sal = (select max(sal) from emp); //求出
57、select deptno, max(sal) from emp group by deptno; //搜素這個(gè)部門中薪水最高的的值
//////////////////////////////////////////////////having函數(shù)對(duì)于group by函數(shù)的過(guò)濾 不能用where//////////////////////////////////////
58、select deptno, avg(sal) from emp group by deptno having avg(sal) >2000; (order by )//求出每個(gè)部門的平均值,并且要 > 2000
59、select avg(sal) from emp where sal >1200 group by deptno having avg(sal) >1500 order by avg(sal) desc;//求出sal>1200的平均值按照deptno分組,平均值要>1500最后按照sal的倒序排列
60、select ename,sal from emp where sal > (select avg(sal) from emp);  //求那些人的薪水是在平均薪水之上的。
61、select ename, sal from emp join (select max(sal) max_sal ,deptno from emp group by deptno) t on (emp.sal = t.max_sal and emp.deptno=t.deptno);  //查詢每個(gè)部門中工資最高的那個(gè)人
///////////////////////////////等值連接//////////////////////////////////////
62、select e1.ename, e2.ename from emp e1, emp e2 where e1.mgr = e2.empno;  //自連接,把一張表當(dāng)成兩張表來(lái)用
63、select ename, dname from emp, dept;  //92年語(yǔ)法 兩張表的連接 笛卡爾積。
64、select ename, dname from emp cross join dept; //99年語(yǔ)法 兩張表的連接用cross join
65、select ename, dname from emp, dept where emp.deptno = dept.deptno; // 92年語(yǔ)法 表連接 + 條件連接
66、select ename, dname from emp join dept on(emp.deptno = dept.deptno); // 新語(yǔ)法
67、select ename,dname from emp join dept using(deptno); //與66題的寫(xiě)法是一樣的,但是不推薦使用using : 假設(shè)條件太多
///////////////////////////////////////非等值連接///////////////////////////////////////////
68、select ename,grade from emp e join salgrade s on(e.sal between s.losal and s.hisal); //兩張表的連接 此種寫(xiě)法比用where更清晰
69、select ename, dname, grade from emp e
	join dept d on(e.deptno = d.deptno)
	join salgrade s on (e.sal between s.losal and s.hisal)
	where ename not like '_A%';  //三張表的連接
70、select e1.ename, e2.ename from emp e1 join emp e2 on(e1.mgr = e2.empno); //自連接第二種寫(xiě)法,同62
71、select e1.ename, e2.ename from emp e1 left join emp e2 on(e1.mgr = e2.empno); //左外連接 把左邊沒(méi)有滿足條件的數(shù)據(jù)也取出來(lái)
72、select ename, dname from emp e right join dept d on(e.deptno = d.deptno); //右外連接
73、select deptno, avg_sal, grade from (select deptno, avg(sal) avg_sal from emp group by deptno) t join salgrade s  on    (t.avg_sal between s.losal and s.hisal);//求每個(gè)部門平均薪水的等級(jí)
74、select ename from emp where empno in (select mgr from emp); // 在表中搜索那些人是經(jīng)理
75、select sal from emp where sal not in(select distinct e1.sal from emp e1 join emp e2 on(e1.sal < e2.sal)); // 面試題 不用組函數(shù)max()求薪水的最大值
76、select deptno, max_sal from
    (select avg(sal) max_sal,deptno from emp group by deptno)
        where max_sal =
        (select max(max_sal) from
	     (select avg(sal) max_sal,deptno from emp group by deptno)
    );//求平均薪水最高的部門名稱和編號(hào)。
77、select t1.deptno, grade, avg_sal from
      (select deptno, grade, avg_sal from
	(select deptno, avg(sal) avg_sal from emp group by deptno) t
    	join salgrade s on(t.avg_sal between s.losal and s.hisal)
      ) t1
    join dept on (t1.deptno = dept.deptno)
    where t1.grade = 
      (
        select min(grade) from
          (select deptno, grade, avg_sal from
	(select deptno, avg(sal) avg_sal from emp group by deptno) t
	join salgrade s on(t.avg_sal between s.losal and s.hisal)
     )
   )//求平均薪水等級(jí)最低的部門的名稱 哈哈 確實(shí)比較麻煩
78、create view v$_dept_avg_sal_info as
    select deptno, grade, avg_sal from
       (select deptno, avg(sal) avg_sal from emp group by deptno) t
    join salgrade s on(t.avg_sal between s.losal and s.hisal);
    //視圖的創(chuàng)建,一般以v$開(kāi)頭,但不是固定的





79、select t1.deptno, grade, avg_sal from v$_dept_avg_sal_info t1
    join dept on (t1.deptno = dept.deptno)
    where t1.grade = 
      (
        select min(grade) from
         v$_dept_avg_sal_info t1
     )
   )//求平均薪水等級(jí)最低的部門的名稱 用視圖,能簡(jiǎn)單一些,相當(dāng)于Java中方法的封裝

80、---創(chuàng)建視圖出現(xiàn)權(quán)限不足時(shí)候的解決辦法:
	conn sys/admin as sysdba;
		顯示:連接成功 Connected
	grant create table, create view to scott;
		顯示: 授權(quán)成功 Grant succeeded
81、-------求比普通員工最高薪水還要高的經(jīng)理人的名稱 -------
    select ename, sal from emp where empno in
       (select distinct mgr from emp where mgr is not null)
    and sal >
    (
       select max(sal) from emp where empno not in
         (select distinct mgr from emp where mgr is not null)
    )
82、---面試題:比較效率
       select * from emp where deptno = 10 and ename like '%A%';//好,將過(guò)濾力度大的放在前面
       select * from emp where ename like '%A% and deptno = 10;
83、-----表的備份
       create table dept2 as select * from dept;
84、-----插入數(shù)據(jù)
        insert into dept2 values(50,'game','beijing');
      ----只對(duì)某個(gè)字段插入數(shù)據(jù)
		insert into dept2(deptno,dname) values(60,'game2');
85、-----將一個(gè)表中的數(shù)據(jù)完全插入另一個(gè)表中(表結(jié)構(gòu)必須一樣)
	insert into dept2 select * from dept;
86、-----求前五名員工的編號(hào)和名稱(使用虛字段rownum 只能使用 < 或 = 要使用 > 必須使用子查詢)
	select empno,ename from emp where rownum <= 5;
86、----求10名雇員以后的雇員名稱--------
	select ename from (select rownum r,ename from emp) where r > 10;
87、----求薪水最高的前5個(gè)人的薪水和名字---------
	select ename, sal from (select ename, sal from emp order by sal desc) where rownum <=5;	
88、----求按薪水倒序排列后的第6名到第10名的員工的名字和薪水--------
	select ename, sal from
           (select ename, sal, rownum r from
              (select ename, sal from emp order by sal desc)
           )
        where r>=6 and r<=10
89、----------------創(chuàng)建新用戶---------------
	1、backup scott//備份
		exp//導(dǎo)出
	2、create user
		create user guohailong identified(認(rèn)證) by guohailong  default tablespace users quota(配額) 10M on users
		grant create session(給它登錄到服務(wù)器的權(quán)限),create table, create view to guohailong
	3、import data
		imp
90、-----------事務(wù)回退語(yǔ)句--------
	rollback;
	
91、-----------事務(wù)確認(rèn)語(yǔ)句--------
	commit;//此時(shí)再執(zhí)行rollback無(wú)效

92、當(dāng)正常斷開(kāi)連接的時(shí)候例如exit,事務(wù)自動(dòng)提交。  當(dāng)非正常斷開(kāi)連接,例如直接關(guān)閉dos窗口或關(guān)機(jī),事務(wù)自動(dòng)提交
93、有3個(gè)表S,C,SC 
	S(SNO,SNAME)代表(學(xué)號(hào),姓名) 
	C(CNO,CNAME,CTEACHER)代表(課號(hào),課名,教師) 
	SC(SNO,CNO,SCGRADE)代表(學(xué)號(hào),課號(hào)成績(jī)) 
	問(wèn)題: 
	1,找出沒(méi)選過(guò)“黎明”老師的所有學(xué)生姓名。 
	2,列出2門以上(含2門)不及格學(xué)生姓名及平均成績(jī)。 
	3,即學(xué)過(guò)1號(hào)課程有學(xué)過(guò)2號(hào)課所有學(xué)生的姓名。
	答案:
	1、
	    select sname from s join sc on(s.sno = sc.sno) join c on (sc.cno = c.cno) where cteacher <> '黎明';
	2、
	    select sname where sno in (select sno from sc where scgrade < 60 group by sno having count(*) >=2);
	3、
	    select sname from s where sno in (select sno, from sc where cno=1 and cno in
							(select distinct sno from sc where cno = 2);
					     )

94、--------------創(chuàng)建表--------------
       create table stu
 	(
 	id number(6),
 	name varchar2(20) constraint stu_name_mm not null,
 	sex number(1),
 	age number(3),
 	sdate date,
 	grade number(2) default 1,
 	class number(4),
 	email varchar2(50) unique
	);
95、--------------給name字段加入 非空 約束,并給約束一個(gè)名字,若不取,系統(tǒng)默認(rèn)取一個(gè)-------------
       create table stu
 	(
 	id number(6),
 	name varchar2(20) constraint stu_name_mm not null,
 	sex number(1),
 	age number(3),
 	sdate date,
 	grade number(2) default 1,
 	class number(4),
 	email varchar2(50)
	);
96、--------------給nameemail字段加入 唯一 約束 兩個(gè) null值 不為重復(fù)-------------
       create table stu
 	(
 	id number(6),
 	name varchar2(20) constraint stu_name_mm not null,
 	sex number(1),
 	age number(3),
 	sdate date,
 	grade number(2) default 1,
 	class number(4),
 	email varchar2(50) unique
	);
97、--------------兩個(gè)字段的組合不能重復(fù) 約束:表級(jí)約束-------------
       create table stu
 	(
 	id number(6),
 	name varchar2(20) constraint stu_name_mm not null,
 	sex number(1),
 	age number(3),
 	sdate date,
 	grade number(2) default 1,
 	class number(4),
 	email varchar2(50),
	constraint stu_name_email_uni unique(email, name)
	);
98、--------------主鍵約束-------------
       create table stu
 	(
 	id number(6),
 	name varchar2(20) constraint stu_name_mm not null,
 	sex number(1),
 	age number(3),
 	sdate date,
 	grade number(2) default 1,
 	class number(4),
 	email varchar2(50),
	constraint stu_id_pk primary key (id),
	constraint stu_name_email_uni unique(email, name)
	);
 ?99、--------------外鍵約束   被參考字段必須是主鍵 -------------
       create table stu
 	(
 	id number(6),
 	name varchar2(20) constraint stu_name_mm not null,
 	sex number(1),
 	age number(3),
 	sdate date,
 	grade number(2) default 1,
 	class number(4) references class(id),
 	email varchar2(50),
	constraint stu_class_fk foreign key (class) references class(id),
	constraint stu_id_pk primary key (id),
	constraint stu_name_email_uni unique(email, name)
	);
	
	create table class 
	(
	id number(4) primary key,
	name varchar2(20) not null
	);
100、---------------修改表結(jié)構(gòu),添加字段------------------
	alter table stu add(addr varchar2(29));
101、---------------刪除字段--------------------------
	alter table stu drop (addr);
102、---------------修改表字段的長(zhǎng)度------------------
	alter table  stu modify (addr varchar2(50));//更改后的長(zhǎng)度必須要能容納原先的數(shù)據(jù)
103、----------------刪除約束條件----------------
	alter table stu drop constraint  約束名
104、-----------修改表結(jié)構(gòu)添加約束條件---------------
	alter table  stu add constraint stu_class_fk foreign key (class) references class (id);
105、---------------數(shù)據(jù)字典表----------------
	 desc dictionary;
	 //數(shù)據(jù)字典表共有兩個(gè)字段 table_name comments
	 //table_name主要存放數(shù)據(jù)字典表的名字
	 //comments主要是對(duì)這張數(shù)據(jù)字典表的描述
	 
105、---------------查看當(dāng)前用戶下面所有的表、視圖、約束-----數(shù)據(jù)字典表user_tables---
	select table_name from user_tables;
	select view_name from user_views;
	select constraint_name from user-constraints;
106、-------------索引------------------
	create index idx_stu_email on stu (email);// 在stu這張表的email字段上建立一個(gè)索引:idx_stu_email
107、---------- 刪除索引 ------------------
	drop index index_stu_email;
108、---------查看所有的索引----------------
	select index_name from user_indexes;
109、---------創(chuàng)建視圖-------------------
	create view v$stu as selesct id,name,age from stu;
	 視圖的作用: 簡(jiǎn)化查詢 保護(hù)我們的一些私有數(shù)據(jù),通過(guò)視圖也可以用來(lái)更新數(shù)據(jù),但是我們一般不這么用 缺點(diǎn):要對(duì)視圖進(jìn)行維護(hù)

110、-----------創(chuàng)建序列------------
	create sequence seq;//創(chuàng)建序列
	select seq.nextval from dual;// 查看seq序列的下一個(gè)值
	drop sequence seq;//刪除序列
111、------------數(shù)據(jù)庫(kù)的三范式--------------
	(1)、要有主鍵,列不可分
	(2)、不能存在部分依賴:當(dāng)有多個(gè)字段聯(lián)合起來(lái)作為主鍵的時(shí)候,不是主鍵的字段不能部分依賴于主鍵中的某個(gè)字段
	(3)、不能存在傳遞依賴 
==============================================PL/SQL==========================
112、-------------------在客戶端輸出helloworld-------------------------------
	set serveroutput on;//默認(rèn)是off,設(shè)成on是讓Oracle可以在客戶端輸出數(shù)據(jù)
113、begin
	dbms_output.put_line('helloworld');
	end;
	/
114、----------------pl/sql變量的賦值與輸出----
	declare
		v_name varchar2(20);//聲明變量v_name變量的聲明以v_開(kāi)頭
	begin
		v_name := 'myname';
		dbms_output.put_line(v_name);
	end;
	/
115、-----------pl/sql對(duì)于異常的處理(除數(shù)為0)-------------
	declare
		v_num number := 0;
	begin
		v_num := 2/v_num;
		dbms_output.put_line(v_num);
	exception
		when others then
		dbms_output.put_line('error');
	end;
	/
116、----------變量的聲明----------
	binary_integer:整數(shù),主要用來(lái)計(jì)數(shù)而不是用來(lái)表示字段類型   比number效率高
	number:數(shù)字類型
	char:定長(zhǎng)字符串
	varchar2:變長(zhǎng)字符串
	date:日期
	long:字符串,最長(zhǎng)2GB
	boolean:布爾類型,可以取值true,false,null//最好給一初值
117、----------變量的聲明,使用 '%type'屬性
	declare
		v_empno number(4);
		v_empno2 emp.empno%type;
		v_empno3 v_empno2%type;
	begin
		dbms_output.put_line('Test');
	end;
	/
	//使用%type屬性,可以使變量的聲明根據(jù)表字段的類型自動(dòng)變換,省去了維護(hù)的麻煩,而且%type屬性,可以用于變量身上
118、---------------Table變量類型(table表示的是一個(gè)數(shù)組)-------------------
	declare
		type type_table_emp_empno is table of emp.empno%type index by binary_integer;
			v_empnos type_table type_table_empno;
	begin
		v_empnos(0) := 7345;
		v_empnos(-1) :=9999;
		dbms_output.put_line(v_empnos(-1));
	end;
119、-----------------Record變量類型
	declare
		type type_record_dept is record
		(
			deptno dept.deptno%type,
			dname dept.dname%type,
			loc dept.loc%type
		);
	begin
		v_temp.deptno:=50;
		v_temp.dname:='aaaa';
		v_temp.loc:='bj';
		dbms_output.put_line(v temp.deptno || ' ' || v temp.dname);
	end;
120、-----------使用 %rowtype聲明record變量
	declare
		v_temp dept%rowtype;
	begin
		v_temp.deptno:=50;
		v_temp.dname:='aaaa';
		v_temp.loc:='bj';
	dbms_output.put_line(v temp.deptno || '' || v temp.dname)			
	end;
	
121、--------------sql%count 統(tǒng)計(jì)上一條sql語(yǔ)句更新的記錄條數(shù) 
122、--------------sql語(yǔ)句的運(yùn)用
	declare
		v_ename emp.ename%type;
		v_sal emp.sal%type;
	begin
		select ename,sal into v_ename,v_sal from emp where empno = 7369;
		dbms_output.put_line(v_ename || '' || v_sal);
	end;

123、  -------- pl/sql語(yǔ)句的應(yīng)用
	declare
		v_emp emp%rowtype;
	begin
		select * into v_emp from emp where empno=7369;
		dbms_output_line(v_emp.ename);
	end;
124、-------------pl/sql語(yǔ)句的應(yīng)用 
	declare
		v_deptno dept.deptno%type := 50;
		v_dname dept.dname%type :='aaa';
		v_loc dept.loc%type := 'bj';
	begin
		insert into dept2 values(v_deptno,v_dname,v_loc);
	commit;
	end;
125、-----------------ddl語(yǔ)言,數(shù)據(jù)定義語(yǔ)言
	begin
		execute immediate 'create table T (nnn varchar(30) default ''a'')';
	end;
126、------------------if else的運(yùn)用
     declare
		v_sal emp.sal%type;
     begin
		select sal into v_sal from emp where empno = 7369;
	if(v_sal < 2000) then
		dbms_output.put_line('low');
	elsif(v_sal > 2000) then
		dbms_output.put_line('middle');
	else 
		dbms_output.put_line('height');
        end if;
      end;
127、-------------------循環(huán) =====do while
	declare
		i binary_integer := 1;
	begin
		loop
				dbms_output.put_line(i);
				i := i + 1;
			exit when (i>=11);
		end loop;
	end;
128、---------------------while 
	declare
		j binary_integer := 1;
	begin
		while j < 11 loop
			dbms_output.put_line(j);
		j:=j+1;
		end loop;
	end;
129、---------------------for
	begin
		for k in 1..10 loop
			dbms_output.put_line(k);
		end loop;
		for k in reverse 1..10 loop
			dbms_output.put_line(k);
		end loop;
	end;
130、-----------------------異常(1)
	declare
		v_temp number(4);
	begin
		select empno into v_temp from emp where empno = 10;
	exception
		when too_many_rows then
			dbms_output.put_line('太多記錄了');
		when others then
			dbms_output.put_line('error');	
	end;
131、-----------------------異常(2)
	declare
		v_temp number(4);
	begin
		select empno into v_temp from emp where empno = 2222;
	exception
		when no_data_found then
			dbms_output.put_line('太多記錄了');
	end;
132、----------------------創(chuàng)建序列
	create sequence seq_errorlog_id start with 1 increment by 1;
133、-----------------------錯(cuò)誤處理(用表記錄:將系統(tǒng)日志存到數(shù)據(jù)庫(kù)便于以后查看)


	創(chuàng)建日志表:
	create table errorlog
	(
	id number primary key,
	errcode number,
	errmsg varchar2(1024),
	errdate date
	);


	
	declare
		v_deptno dept.deptno%type := 10;
		v_errcode  number;
		v_errmsg varchar2(1024);
	begin
		delete from dept where deptno = v_deptno;
	   commit;
	exception
		when others then
			rollback;
				v_errcode := SQLCODE;
				v_errmsg := SQLERRM;
		insert into errorlog values (seq_errorlog_id.nextval, v_errcode,v_errmsg, sysdate);
				commit;
	end;
133---------------------PL/SQL中的重點(diǎn)cursor(游標(biāo))和指針的概念差不多
	declare
		cursor c is
			select * from emp; //此處的語(yǔ)句不會(huì)立刻執(zhí)行,而是當(dāng)下面的open c的時(shí)候,才會(huì)真正執(zhí)行
		v_emp c%rowtype;
	begin
		open c;
			fetch c into v_emp;
		dbms_output.put_line(v_emp.ename); //這樣會(huì)只輸出一條數(shù)據(jù) 134將使用循環(huán)的方法輸出每一條記錄
	  close c;
	end;
134----------------------使用do while  循環(huán)遍歷游標(biāo)中的每一個(gè)數(shù)據(jù)
	declare
		cursor c is
			select * from emp;
		v_emp c%rowtype;
	begin
		open c;	
		loop
			fetch c into v_emp;
		    (1)	exit when (c%notfound);  //notfound是oracle中的關(guān)鍵字,作用是判斷是否還有下一條數(shù)據(jù)
		    (2)	dbms_output.put_line(v_emp.ename);  //(1)(2)的順序不能顛倒,最后一條數(shù)據(jù),不會(huì)出錯(cuò),會(huì)把最后一條數(shù)據(jù),再次的打印一遍
	   end loop;
	   close c;
	end;
135------------------------while循環(huán),遍歷游標(biāo)
	declare
		cursor c is
			select * from emp;
		v_emp emp%rowtype;
	begin
		open c;
		fetch c into v_emp;
		while(c%found) loop
		   dbms_output.put_line(v_emp.ename);
		   fetch c into v_emp;
	   end loop;
	   close c;
	end;
136--------------------------for 循環(huán),遍歷游標(biāo)
	declare
		cursor c is
		   select * from emp;
	begin
		for v_emp in c loop
			dbms_output.put_line(v_emp.ename);
		end loop;
	end;

137---------------------------帶參數(shù)的游標(biāo)
	declare
		cursor c(v_deptno emp.deptno%type, v_job emp.job%type)
		is
		   select ename, sal from emp where deptno=v_deptno and job=v_job;
		--v_temp c%rowtype;此處不用聲明變量類型
	begin
		for v_temp in c(30, 'click') loop
			dbms_output.put_line(v_temp.ename);
		end loop;
	end;
138-----------------------------可更新的游標(biāo)
	declare
		cursor c  //有點(diǎn)小錯(cuò)誤
		is
		   select * from emp2 for update;
		-v_temp c%rowtype;
	begin
	   for v_temp in c loop
		if(v_temp.sal < 2000) then
			update emp2 set sal = sal * 2 where current of c;
	      else if (v_temp.sal =5000) then
		delete from emp2 where current of c;
	       end if;
	     end loop;
	     commit;
	end;
139-----------------------------------procedure存儲(chǔ)過(guò)程(帶有名字的程序塊)
	create or replace procedure p
		is--這兩句除了替代declare,下面的語(yǔ)句全部都一樣  
	    cursor c is
			select * from emp2 for update;
	begin
	     for v_emp in c loop
		if(v_emp.deptno = 10) then
			update emp2 set sal = sal +10 where current of c;
		else if(v_emp.deptno =20) then
			update emp2 set sal =  sal + 20 where current of c;
		else
			update emp2 set sal = sal + 50 where current of c;
		end if;
	    end loop;
	  commit;
	 end;
	
	執(zhí)行存儲(chǔ)過(guò)程的兩種方法:
	(1)exec p;(p是存儲(chǔ)過(guò)程的名稱)
	(2)
		begin
			p;
		end;
		/
140-------------------------------帶參數(shù)的存儲(chǔ)過(guò)程
	create or replace procedure p
		(v_a in number, v_b number, v_ret out number, v_temp in out number)
	is
	
	begin
		if(v_a > v_b) then
			v_ret := v_a;
		else
			v_ret := v_b;
		end if;
		v_temp := v_temp + 1;
	end;
141----------------------調(diào)用140
	declare
		v_a  number := 3;
		v_b  number := 4;
		v_ret number;
		v_temp number := 5;

	begin
		p(v_a, v_b, v_ret, v_temp);
		dbms_output.put_line(v_ret);
		dbms_output.put_line(v_temp);
	end;

142------------------刪除存儲(chǔ)過(guò)程
	drop procedure p;
143------------------------創(chuàng)建函數(shù)計(jì)算個(gè)人所得稅  
	create or replace function sal_tax
		(v_sal  number)	
		return number
	is
	begin
		if(v_sal < 2000) then
			return 0.10;
		elsif(v_sal <2750) then
			return 0.15;
		else
			return 0.20;
		end if;
	end;
144-----------------------------創(chuàng)建觸發(fā)器(trigger)	觸發(fā)器不能單獨(dú)的存在,必須依附在某一張表上

	//創(chuàng)建觸發(fā)器的依附表
	
	create table emp2_log
	(
	ename varchar2(30) ,
	eaction varchar2(20),
	etime date
	);	

	create or replace trigger trig
		after insert or delete or update on emp2 ---for each row 加上此句,每更新一行,觸發(fā)一次,不加入則值觸發(fā)一次
	begin
		if inserting then
			insert into emp2_log values(USER, 'insert', sysdate);
		elsif updating then
			insert into emp2_log values(USER, 'update', sysdate);
		elsif deleting then
			insert into emp2_log values(USER, 'delete', sysdate);
		end if;
	end;
145-------------------------------通過(guò)觸發(fā)器更新數(shù)據(jù)
	create or replace trigger trig
		after update on dept
		for each row
	begin
		update emp set deptno =:NEW.deptno where deptno =: OLD.deptno;
	end;
	

	//////只編譯不顯示的解決辦法 set serveroutput on;
145-------------------------------通過(guò)創(chuàng)建存儲(chǔ)過(guò)程完成遞歸
	create or replace procedure p(v_pid article.pid%type,v_level binary_integer) is
		cursor c is select * from article where pid = v_pid;
		v_preStr varchar2(1024) := '';
	begin
	  for i in 0..v_leave loop
		v_preStr := v_preStr || '****';
	  end loop;

	  for v_article in c loop
		dbms_output.put_line(v_article.cont);
		if(v_article.isleaf = 0) then
			p(v_article.id);
		end if;
		end loop;
	
	end;
146-------------------------------查看當(dāng)前用戶下有哪些表---
	首先,用這個(gè)用戶登錄然后使用語(yǔ)句:
	select * from tab;
	
147-----------------------------用Oracle進(jìn)行分頁(yè)!--------------
	因?yàn)镺racle中的隱含字段rownum不支持'>'所以:
	select * from (
		select rownum rn, t.* from (
			select * from t_user where user_id <> 'root'
		) t where rownum <6
	) where rn >3
148------------------------Oracle下面的清屏命令----------------
	clear screen; 或者 cle scr;

149-----------將創(chuàng)建好的guohailong的這個(gè)用戶的密碼改為abc--------------
    alter user guohailong identified by abc
    當(dāng)密碼使用的是數(shù)字的時(shí)候可能會(huì)不行