接plsql一文


--游标cursor,结果集上的指针

[sql]  

  1. declare  

  2.   cursor c is  

  3.     select * from emp;--只是声明游标,还未取数据  

  4.   v_emp c%rowtype  

  5. begin  

  6.   open c;  

  7.   fetch c into v_emp;  

  8.   dbms_output.put_line(v_emp.ename);  

  9.   close c;  

  10. end;  

  11.   

  12. declare  

  13.   cursor c is  

  14.     select * from emp;  

  15.   v_emp c%rowtype;  

  16. beigin  

  17.   open c;  

  18.   loop  

  19.     fetch c into v_emp;  

  20.     exit when (c%notfound);  

  21.     dbms_output.put_line(v_emp.ename);  

  22.   end loop;  

  23.   close c;  

  24. end;  


--带参数的游标

[sql]  

  1. declare  

  2.   cursor c(v_deptno emp.deptno%type,v_job emp.job%type)  

  3.   is  

  4.     select ename,sal from emp where deptno = v_deptno and job = v_job;  

  5. begin  

  6.   for v_temp in c(30,'clerk') loop  

  7.     dbms_output.put_line(v_temp.ename);  

  8.   end loop;  

  9. end;  

 

--可更新的游标

[sql] 

  1. declare  

  2.   cursor c  

  3.   is  

  4.     select * from emp2 for update;  

  5. begin  

  6.   for v_temp in c loop  

  7.     if(v_temp.sal < 2000) then  

  8.       update emp2 set sal = sal*2 where current of c;  

  9.     else if (v_temp.sal = 5000) then  

  10.       delete from emp2 where current of c;  

  11.     end if;  

  12.   end loop;  

  13.   commit;  

  14. end;  


--创建存储过程,带有名字的PL/SQL块

[sql]  

  1. grant create procedure to shijin;  

  2. create or replace procedure p  

  3. is  

  4.   cursor c is  

  5.     select * from emp2 for update;  

  6. begin  

  7.   for v_emp in c loop  

  8.     if(v_emp.deptno = 10) then  

  9.       update emp2 set sal = sal + 10 where current of c;  

  10.     else if (v_emp.deptno = 20) then  

  11.       update emp2 set sal = sal + 20 where current of c;  

  12.     else  

  13.       update emp2 set sal = sal + 50 where current of c;  

  14.     end if;  

  15.   end loop;  

  16.   commit;  

  17. end loop;  

  18.   

  19. begin  

  20.   p;  

  21. end;  

  22. 或者  

  23. exec p;  


--带参数的存储过程,默认是in

[sql]  

  1. create or replace procedure p  

  2.   (v_a in number,v_b number,v_ret out number,v_temp in out number)  

  3. is  

  4.   

  5. begin   

  6.   if (v_a > v_b) then  

  7.     v_ret := v_a;  

  8.   else  

  9.     v_ret := v_b;  

  10.   end if;  

  11.   v_temp := v_temp + 1;  

  12. end;  

  13.   

  14. declare  

  15.   v_a number := 3;  

  16.   v_b number := 4;  

  17.   v_ret number;  

  18.   v_temp number := 5;  

  19. begin  

  20.   p(v_a,v_b,v_ret,v_temp);  

  21.   dbms_output.put_line(v_ret);  

  22.   dbms_output.put_line(v_temp);  

  23. end;  


--函数

[sql]  

  1. create or replace function sal_tax  

  2.   (v_sal number)  

  3.   return number  

  4. is  

  5. begin  

  6.   if(v_sal < 2000) then  

  7.     return 0.10;  

  8.   elsif(v_sal < 2750) then  

  9.     return 0.15;  

  10.   else  

  11.     return 0.20;  

  12.   end if;  

  13. end;  

  14.   

  15. select sal_tax(sal) from emp;  


--触发器!!!!牢牢掌握概念

[sql]  

  1. create table emp2_log  

  2. (  

  3.   uname varchar2(20),  

  4.   action varchar2(10),  

  5.   atime date  

  6. );  

  7. grant create triger to shijin;  

  8. create or replace trigger trig  

  9.   after insert or delete or update on emp2 --此处可以加上for each row  

  10. begin  

  11.   if inserting then  

  12.     insert into emp2_log values (USER,'insert',sysdate);  

  13.   elsif updating then  

  14.     insert into emp2_log values (USER,'update',sysdate);  

  15.   elsif deleting then  

  16.     insert into emp2_log values (USER,'delete',sysdate);  

  17.   end if;  

  18. end;  

  19.   

  20. update emp2 set sal = sal*2 where deptno = 30;  

  21.   

  22. drop trigger trig;  

  23.   

  24. create or replace trigger trig  

  25.   after update on dept  

  26.   for each row  

  27. begin  

  28.   update emp set deptno = :NEW.deptno where deptno = :OLD.deptno;  

  29. end;  


--树状结构数据的存储与显示

[sql]  

  1. drop table article;  

  2.   

  3. create table article  

  4. (  

  5.   id number primary key,  

  6.   cont varchar2(4000),  

  7.   pid number,  

  8.   isleaf number(1),--0代表非叶子节点,1代表叶子节点  

  9.   alevel number(2)  

  10. )  

  11.   

  12. create or replace procedure p (v_pid article.pid%type,v_level binary_integer) is  

  13.   cursor c is select * from article where pid = v_pid;  

  14.   v_preStr varchar2(1024) := '';  

  15. begin  

  16.   for i in 1..v_level loop  

  17.     v_preStr := v_preStr || '****';  

  18.   end loop;  

  19.   for v_article in c loop  

  20.     dbms_output.put_line(v_preStr || v_article.cont);  

  21.     if(v_article.isleaf = 0) then  

  22.       p(v_articel.id,v_level + 1);  

  23.     end if;  

  24.   end loop;  

  25. end;  

  26. insert into article values (1,'蚂蚁大战大象',0,0,0);  

  27. insert into article values (2,'大象被打趴下',1,0,1);  

  28. insert into article values (3,'蚂蚁也不好过',2,1,2);  

  29. insert into article values (4,'瞎        说',2,0,2);  

  30. insert into article values (5,'没 有 瞎  说',4,1,3);  

  31. insert into article values (6,'怎 么 可  能',1,0,1);  

  32. insert into article values (7,'怎么没有可能',6,1,2);  

  33. insert into article values (8,'可能性很大的',6,1,2);  

  34. insert into article values (9,'大象进医院了',2,0,2);  

  35. insert into article values (10,'护士是蚂蚁',9,1,3);  

  36.    

  37. begin  

  38.   p(0,0);  

  39. end;  

  40. show error;  

  41. --展示emp的树状结构