PLSQL语言(二)

 
  1. 24 比普通员工最高薪水还要高的经理人  
  2.   
  3. select ename from emp where empno in   
  4. (select distinct mgr from emp where mgr is not null)  
  5. and sal >  
  6. (  
  7.     select max(sal) from emp where empno not in  
  8.     (select distinct mgr from empwhere mgr is not null)  
  9. )  
  10.   
  11. /  
  12.   
  13. 求部门经理人中平均薪水最低的部门名称  
  14.   
  15.   
  16.   
  17. 求薪水最高的前5名员工  
  18.   
  19. select ename ,sal from (  
  20. select ename,sal from emp order by sal desc)  
  21. where rownum <=5  
  22.   
  23.   
  24. 求薪水最高的第6到第10名员工(重点掌握)  
  25.   
  26. select ename,sal from (  
  27. select rownum r,ename,sal from  
  28. (  
  29. select ename,sal from emp order by sal desc  
  30. ))   
  31. where r >5 and r <= 10  
  32.   
  33. 1-- backup scott  
  34.     exp  
  35.   
  36. 2-- create user  
  37.     create user jetwu identified by jetwu default tablespace users quota 10M on users  
  38.     grant create session--登录权限, create table, create view to jetwu  
  39.   
  40. 3-- import the data  
  41.     imp  
  42.   
  43.   
  44. --备份一张表  
  45. create table emp2 as select * from emp;  
  46.   
  47. insert into dept2 select * from dept;  
  48.   
  49. rownum  
  50. --取15条记录中后5条记录值   
  51. select ename from (select rownum r, ename from emp) where r > 10;  
  52.   
  53. --取薪水最高的5个人  
  54. select ename, sal from  
  55. (select ename,sal from emp order by sal desc) where rownum <=5;  
  56.   
  57. --取薪水最高的610  
  58. select ename, sal from  
  59. (  
  60.   select ename, sal, rownum r from  
  61.   (  
  62.   select ename, sal from emp order by sal desc  
  63.   )  
  64. )  
  65. where r >=6 and r <=10;  
  66.   
  67.   
  68. 3张表S,C,SC  
  69. S(SNO,SNAME)  
  70. C(CNO,CNAME,CTEACHER)  
  71. SC(SNO,CNO,SCGRADE)  
  72. 1.找出没选过黎明老师的所有学生姓名  
  73. 2.列出2门以上(含2门)不及格学生姓名及平均成绩  
  74. 3.即学过1号课又学过2号课所有学生的姓名  
  75. 1.select ename from s join sc on(s.sno=sc.sno) join c on(c.cno = sc.cno) where c.cteacher <> '黎明';  
  76. 2.select s.sname sc.avg(scgrade) from s s,sc sc where s.sno = sc.sno and  
  77.  sc.scgrade < 60 group by sc.sno having count(*) >=2   
  78.   
  79. 3.  
  80. select sname from s join sc on (s.sno=(  
  81. select sno from sc where cno = 1 and sno in (select distinct sno from sc where cno = 2)));  
  82.   
  83. 28 字段约束,是将约束加在字段后面   
  84.   
  85.    非空约束  constraint xxx not null  
  86.   
  87.    唯一约束  unique  
  88.   
  89.    两个空值不认为是重复的  
  90.   
  91.    表级约束,  constraint xxxx(名字随便起) unique(email[字段名],name[字段名])    {表示这两个字段的组合不能为空}  
  92.   
  93. 29 主键约束  
  94.     primary key (唯一的不可重复的不可为空的)  
  95.    外键约束  
  96.     references 表名(字段)  
  97.     写成表级约束  
  98.     constraint xxx foreign key (字段名) references 外表名(外表字段)  
  99.   
  100. 如:create table stu(  
  101.         id int,  
  102.     name varchar(50) constraint aaa not null,   
  103.     class1 number(6) ,  
  104.     email varchar(30) ,  
  105.     constraint stu_class_id foreign key (class1) references class(id),  
  106.     constraint xxx unique(name,email)           
  107.     );  
  108.   
  109.     create table class(  
  110.      id number(6) primary key,  
  111.      name varchar2(10)  
  112.     )  
  113.   
  114.   
  115.   
  116. 31 修改表结构 alter  
  117.   
  118.    增加字段  
  119.     alter table 表名 add(字段名,参数)  
  120.     如:alter table stu add(school,varchar2(20));  
  121.   
  122.    删除字段  
  123.     alter table 表名 drop(字段名)  
  124.     如:alter table stu drop(school);  
  125.   
  126.    修改字段  
  127.     alter table 表名 modify(字段名,参数)  
  128.     如:alter table stu modify(email,varchar(50))  
  129.   
  130.   
  131. 33  索引  
  132.   
  133. 一个表如果加了 “主键限制”,“唯一限制”,“组合限制”  
  134.   
  135. oracle会自动生成索引  
  136.   
  137. 索引创建格式  
  138.   
  139. create index xxx(索引名随便起,最好见名知义) on 表名(字段名)  
  140. 如:create index index_stu_email on stu(email);  
  141.   
  142. 删除索引  
  143.   
  144. drop index xxx;  
  145.   
  146. 显示数据库中有什么索引  
  147.   
  148. select index_name from user_indexes;  
  149.   
  150. 第一范式-要有主键,列不可分,  
  151.   
  152. 第二范式-不能存在部分依赖,不是主键的字段不能部分依赖主键  
  153.   
  154. 第三范式-除了主键外的字段不能存在传递依赖  
  155.   
  156.   
  157. PL SQL显示  
  158. pl/sql 面向过程的sql 带有分支和循环的sql  
  159.   
  160. 匿名块 :没有名字的程序  
  161.   
  162. PL/SQL分为四块  
  163.   
  164. declare 定义变量(可有可无)  
  165. begin 程序从这里开始(必须)  
  166. exception 有异常时执行  
  167. end;(必须)  
  168.   
  169. 如:  
  170.     set serveroutput on;(必须先执行这一命令,因为默认是OFF,如果是OFF的话,就不会输出)  
  171.     begin  
  172.         dbms_output.put_line('helloworld');  
  173.         end;  
  174.   
  175. set serveroutput on;  
  176.   
  177. declare  
  178.     v_name varchar2(20);  
  179. begin  
  180.     v_name := 'myname';  
  181.     dbms_output.put_line(v_name);  
  182. end;  
  183.   
  184.   
  185.   
  186. declare  
  187.     v_num number :=0;  
  188. begin  
  189.     v_num := 2/v_num;  
  190.     dbms_output.put_line(v_num);  
  191. exception  
  192.     when others then  
  193.     dbms_output.put_line('error');  
  194. end;  
  195.   
  196.   
  197. --变量声明的规则  
  198.   
  199. 1.  变量名不能够使用保留字,如from,select等  
  200. 2.  第一个字符必须是字母  
  201. 3.  变量名最多包含30个字符  
  202. 4.  不要与数据库的表或者列同名  
  203. 5.  每一行只能声明一个变量  
  204.   
  205. --常用变量类型  
  206.   
  207. 1.  binary_interger:整数,主要用来计数而不是用来表示字段类型  
  208. 2.  number:数字类型  
  209. 3.  char:定长字符串  
  210. 4.  varchar2:变长字符串  
  211. 5.  date:日期  
  212. 6.  long:长字符串,最长2GB  
  213. 7.  boolean:布尔类型,可以取值为truefalsenull值  
  214.   
  215.   
  216. --变量声明  
  217. declare  
  218.     v_temp number(1);  
  219.     v_count binary_integer := 0;  
  220.     v_sal number(7,2) := 4000.00;  
  221.     v_date date := sysdate;  
  222.     v_pi constant number(3,2) := 3.14;  
  223.     v_valid boolean := false;  
  224.     v_name varchar(20) not null := 'MyName';  
  225. begin  
  226.     dbms_output.put_line('v_temp value:' || v_count);  
  227. end;  
  228. 当变量声明为boolean类型时,该变量能不直接打印  
  229. 如上面变量不能写成  
  230.     dbms_output.put_line(v_valid);  
  231.   
  232. --变量声明,使用%type属性  
  233. declare  
  234.     v_empno number(4);  
  235.     v_empno2 emp.empno%type;  
  236.     v_empno3 v_empno2%type;  
  237. begin  
  238.     dbms_output.put_line('Test');  
  239. end;  
  240. 当使用“%type” 声明变量时,该变量变得灵活,会随着表的字段的修改而自动修改      
  241.   
  242.   
  243. --Table变量类型    Table复合变量(相当于java中的数组)  
  244. declare  
  245.     type(关键字,说明是定义的新类型) type_table_emp_empno is table of emp.empno%type index by binary_integer;  
  246.     v_empnos type_table_emp_empno;  
  247. begin   
  248.     v_empnos(0) := 7369;  
  249.     v_empnos(2) := 7839;  
  250.     v_empnos(-1) := 9999;  
  251.     dbms_output.put_line(v_empnos(-1));  
  252. end;  
  253.   
  254. --Record变量类型 (record变量相当于java中的类)  
  255. declare  
  256.     type type_record_dept is record  
  257.     (  
  258.         deptno dept.deptno%type,  
  259.         dname dept.dname%type,  
  260.         loc dept.loc%type  
  261.     );  
  262.     v_temp type_record_dept;  
  263. begin  
  264.     v_temp.deptno := 50;  
  265.     v_temp.dname := 'aaaa';  
  266.     v_temp.loc := 'bj';  
  267.     dbms_output.put_line(v_temp.deptno || ' ' || v_temp.dname);  
  268. end;  
  269.   
  270. --使用%rowtype声明record变量 (record变量相当于java中的类)可以随着表的改动自动更新变量  
  271. declare  
  272.     v_temp dept%rowtype;  
  273. begin  
  274.     v_temp.deptno := 50;  
  275.     v_temp.dname := 'aaaa';  
  276.     v_temp.loc := 'bj';  
  277.     dbms_output.put_line(v_temp.deptno || ' ' || v_temp.dname);  
  278. end;  
  279.   
  280. --SQL语句的运用  
  281. 在PL/SQL里面用select 必须加 “into”,且在select语句里面必须有且只能返回一条语句  
  282. declare  
  283.     v_ename emp.ename%type;  
  284.     v_sal emp.sal%type;  
  285. begin  
  286.     select ename,sal into v_ename,v_sal from emp where empno = 789;  
  287.     dbms_output.put_line(v_ename || ' ' || v_sal);  
  288. end;  
  289.   
  290.   
  291. declare  
  292.     v_ename emp.ename%type;  
  293.     v_sal emp.sal%type;  
  294. begin  
  295.     select ename,sal into v_ename,v_sal from emp where deptno = 10  
  296.     dbms_output.put_line(v_ename || ' ' || v_sal);  
  297. end;  
  298.   
  299. --ddl在PL/SQL中的运用  
  300.   
  301. 创建表  
  302.   
  303. 在PL/SQL中创建表时,前面必须加“execute immediate” ,然后后面的建表语句用单引号引上  
  304. 如果在单引号中,又出现单引号,则内部单引号用 (‘’)代表(‘);  
  305. begin  
  306.     execute immediate 'create table t (nnn varchar2(20) default ''aaa'')';  
  307. end;  
  308.   
  309.   
  310. --游标 cursor  
  311.   
  312. declare  
  313.     cursor c is  
  314.         select * from emp;  
  315.     v_emp c%rowtype;  
  316. begin  
  317.     open c;  
  318.     fetch c into v_emp;  
  319.     dbms_output.put_line(v_emp.ename);  
  320.     close c;  
  321. end;  
  322.   
  323.   
  324.   
  325.   
  326. declare  
  327.     cursor c is  
  328.         select * from emp;  
  329.     v_emp c%rowtype;  
  330. begin  
  331.     open c;  
  332.     loop  
  333.       
  334.        fetch c into v_emp;  
  335.        exit when (c%notfound);  
  336.        dbms_output.put_line(v_emp.ename);  
  337.     end loop;  
  338.     close c;  
  339. end;  
  340.   
  341.   
  342. --循环遍历  
  343. declare  
  344.     cursor c is  
  345.         select * from emp;  
  346.     v_emp c%rowtype;  
  347. begin  
  348.     open c;  
  349.     loop  
  350.       
  351.        fetch c into v_emp;  
  352.        dbms_output.put_line(v_emp.ename);  
  353.        exit when (c%notfound);  
  354.   
  355.     end loop;  
  356.     close c;  
  357. end;  
  358.   
  359. --IF语句  
  360.   
  361. 取出7369的薪水,如果 <1200 ,则输出‘low’,如果 <2000则输出‘middle’,否则'hign'  
  362.   
  363. declare  
  364.     v_sal emp.sal%type;  
  365. begin  
  366.     select sal into v_sal from emp where empno = 7369;  
  367.     if(v_sal < 1200) then  
  368.         dbms_output.put_line('low');  
  369.     elsif(v_sal <2000) then                          //elsif这里中间的E是没有的  
  370.         dbms_output.put_line('middle');  
  371.     else  
  372.         dbms_output.put_line('hign');  
  373.     end if;  
  374. end;  
  375.   
  376. 循环 PL/SQL里面的循环一定是以LOOP 开始,以END LOOP结束  
  377.   
  378. 下面这个相当于 DO WHILE  
  379. declare   
  380.     i binary_integer := 1;  
  381. begin  
  382.     loop  
  383.         dbms_output.put_line(i);  
  384.         i := i + 1;  
  385.         exit when( i >= 11);  
  386.     end loop;  
  387. end;  
  388.   
  389.   
  390.   
  391. 下面相当于while循环  
  392. declare  
  393.     j binary_integer := 1;  
  394. begin  
  395.     while j < 11 loop  
  396.         dbms_output.put_line(i);  
  397.         j := j + 1;  
  398.     end loop;  
  399. end  
  400.   
  401. --for循环  
  402. declare  
  403.     cursor c is  
  404.         select * from emp;  
  405. begin  
  406.     for v_emp in c loop  
  407.     dbms_output.put_line(v_emp.ename);  
  408.     end loop;  
  409. end;  
  410.   
  411.   
  412. --带参数的游标  
  413.   
  414. declare  
  415.     cursor c(v_deptno emp.deptno%type, v_job emp.job%type)  
  416.     is  
  417.     select ename,sal from emp where deptno = v_deptno and job = v_job;  
  418. begin  
  419.     for v_temp in c(30,'CLERK') loop  
  420.         dbms_output.put_line(v_temp.ename);  
  421.     end loop;  
  422. end;  
  423.   
  424.   
  425. --可更新的游标  
  426. declare  
  427.     cursor c  
  428.     is  
  429.     select * from emp2 for update;  
  430. begin  
  431.   
  432.     for v_temp in c loop  
  433.        if(v_temp.sal < 2000) then  
  434.         update emp2 set sal = sal*2 where current of c;  
  435.         elsif (v_temp.sal = 5000) then  
  436.             delete form emp2 where current of c;  
  437.         end if;  
  438.     end loop;  
  439.     commit;  
  440. end;  
  441.   
  442.   
  443. --存储过程  
  444. create or replace procedure p  
  445. is  
  446. --上面的替代declare,其他都一样  
  447.     cursor c is  
  448.         select * from emp2 for update;  
  449. begin  
  450.     for v_emp in c loop  
  451.         if (v_emp.deptno = 10) then  
  452.             update emp2 set sal = sal + 10 where current of c;  
  453.         elsif (v_emp.deptno = 20)  
  454.             update emp2 set sal = sal + 20 where current of c;  
  455.         else   
  456.             update emp2 set sal = sal + 50 where current of c;  
  457.         end if;  
  458.     end loop;  
  459.     commit;  
  460. end;  
  461.   
  462. --执行存储过程  
  463. exec p;  
  464. 另外一种执行方式  
  465. begin  
  466. p;  
  467. end;  
  468.   
  469.   
  470. --带参数的存储过程  
  471. create or replace procedure p  
  472.     (v_a in number, v_b number, v_ret out number,v_temp in out number )  
  473. is  
  474.   
  475. begin  
  476.     if(v_a > v_b) then  
  477.         v_ret := v_a;  
  478.     else  
  479.         v_ret := v_b;  
  480.     end if;  
  481.     v_temp := v_temp + 1;  
  482. end;  
  483.   
  484.   
  485. declare  
  486.     v_a number := 3;  
  487.     v_b number := 4;  
  488.     v_ret number;  
  489.     v_temp number := 5;  
  490. begin  
  491.     p(v_a,v_b,v_ret,v_temp);  
  492.     dbms_output.put_line(v_ret);  
  493.     dbms_output.put_line(v_temp);  
  494. end;  
  495.   
  496. --函数  
  497. create or replace function sax_tax  
  498.     (v_sal number)  
  499.     return number  
  500. is  
  501. begin  
  502.     if(v_sal < 2000) then  
  503.         return 0.10;  
  504.     elsif(v_sal < 2750) then  
  505.         return 0.15;  
  506.     else  
  507.         return 0.20;  
  508.     end if;  
  509. end;  
  510.   
  511. --执行函数  
  512. select lower(ename), sal_tax(sal) from emp;  
  513.   
  514.   
  515. --触发器 当做一个件事的时候,一触动就会触发另一事件  
  516. create table emp2_log  
  517. (  
  518. uname varchar2(20),  
  519. action varchar2(10),  
  520. atime date  
  521. );  
  522.   
  523. create or replace trigger trig  
  524.     after insert or delete or update on emp2 for each row  
  525. begin  
  526.     if inserting then  
  527.         insert into emp2_log values (USER, 'insert',sysdate);  
  528.     elsif updateing then  
  529.         insert into emp2_log values (USER, 'update',sysdate);  
  530.     elsif deleting then  
  531.         insert into emp2_log values (USER, 'delete',sysdate);  
  532.     end if;  
  533. end;  
  534.       
  535. --触发器用于更新关联  
  536.   
  537. create or replace trigger trig  
  538.     after update on dept  
  539.     for each row  
  540. begin  
  541.     update emp set deptno = :NEW.deptno where deptno = :OLD.deptno;  
  542. end;  
  543.   
  544. 应用  
  545. update dept set deptno = 99 where deptno = 10;--NEW.deptno:99  OLD.deptno:10  
  546.   
  547.   
  548. --树状结构的存储与展示  
  549. drop talbe article;  
  550.   
  551. create table article  
  552. (  
  553. id number primary key,  
  554. cont varchar2(4000),  
  555. pid number,  
  556. isleaf number(1),    --0 代表非叶子节点,1代表叶子节点  
  557. alevel number(2)  
  558. );  
  559.   
  560. insert into article values (1,'蚂蚁大战大象',0,0,0);  
  561. insert into article values (2,'大象被打趴下了',1,0,1);  
  562. insert into article values (3,'蚂蚁也不好过',2,1,2);  
  563. insert into article values (4,'瞎说',2,0,2);  
  564. insert into article values (5,'没有瞎说',4,1,3);  
  565. insert into article values (6,'怎么可能',1,0,1);  
  566. insert into article values (7,'怎么没有可能',6,1,2);  
  567. insert into article values (8,'可能性是很大的',6,1,2);  
  568. insert into article values (9,'大象进医院了',2,0,2);  
  569. insert into article values (10,'护士是蚂蚁',9,1,3);  
  570.   
  571. 蚂蚁大战大象  
  572.     大象被打趴下了  
  573.     蚂蚁也不好过  
  574.     瞎说  
  575.         没有瞎说  
  576.     大象进医院了  
  577.         护士是蚂蚁  
  578.     怎么可能  
  579.     怎么没有可能  
  580.     可能性是很大的  
  581.   
  582.   
  583. create or replace procedure p(v_pid article.pid%type, v_level binary_integer)   
  584. is  
  585. cursor c is select * from article where pid = v_pid;  
  586. v_preStr varchar2(1024) := '';  
  587. begin  
  588.     for i in 1..v_level loop  
  589.         v_preStr := v_preStr || '   |';  
  590.     end loop;  
  591.   
  592.     for v_article in c loop  
  593.         dbms_output.put_line(v_preStr || v_article.cont);  
  594.         if(v_article.isleaf=0) then   
  595.             p(v_article.id,v_level + 1);  
  596.         end if;  
  597.     end loop;  
  598. end;  
  599.      

你可能感兴趣的:(exception,table,Integer,存储,语言,email)