分享

[oracle编程]pl/sql

 我的java之路 2016-12-20
说明: 使用oracle10.2 scott方案下的emp表做的练习,所有块都验证过
注意: 要先打开oracle的打印选项
声明:  多处参照韩顺平oracle视频,所以命名基本出现为sp_..
这里用的都是块,如果要写成过程,请参照下面的语法,调用方法为
exec 过程名
call 过程名  2种
  1. --过程的语法 更改某个人的工资   
  2. create or replace procedure sp_pro3(spName varchar2,newSal number) is   
  3. begin   
  4.    update emp set sal=newSal where ename=spName;    
  5. end;   
  6. --包   生成一个包的语法   
  7. create or replace package abc is   
  8.    
  9. end;   
--有了块之后我们很容易就可以进行封装,所以为了简单起见使用块来学习和试验
--如何使用标量****************************************常量,一般变量

  1. --输入员工号得到工资等信息   
  2. --税率为0.03   
  3. declare    
  4. --常量用c开头,变量让v开头   
  5. c_tax_rate number(7,2):=0.03;   
  6. v_ename varchar(10);   
  7. v_sal number(7,2);   
  8. v_tax_sal number(7,2);   
  9. begin    
  10. select ename,sal into v_ename,v_sal from emp where empno=&no;   
  11. --计算所得税,赋值符号一定不能错   
  12. v_tax_sal:=v_sal*c_tax_rate;   
  13. --输出信息   
  14. dbms_output.put_line('此员工的信息如下:'||v_ename||'  工资:'||v_sal||'  税:'||v_tax_sal);   
  15. end;  

--使用%type方式复制变量类型,减少错误。
v_ename varchar(10);
--可以写为
v_ename emp.ename%type;

  1. --让我们对上述的代码改写下   
  2. declare   
  3. c_tax_rate number(7,2):=0.03;   
  4. v_ename emp.ename%type;   
  5. v_sal emp.sal%type;   
  6. v_tax_sal emp.sal%type;   
  7. begin    
  8. select ename,sal into v_ename,v_sal from emp where empno=&no;   
  9. v_tax_sal:=v_sal*c_tax_rate;   
  10. dbms_output.put_line('此员工的信息如下:'||v_ename||'  工资:'||v_sal||'  税:'||v_tax_sal);   
  11. end;   
--复合变量的使用方法***************************************记录和表
--记录类似高级语言中的结构体,表相当于数组
  1. --使用记录变量的实例   
  2. declare   
  3. --定义一个pl/sql记录类型   
  4. type emp_record_type is record(name emp.ename%type,sal emp.sal%type);   
  5. --给记录一个别名   
  6. sp_record emp_record_type;   
  7. begin   
  8. select ename,sal into sp_record from emp where empno=&no;   
  9. --获取记录里的信息的方法   
  10. dbms_output.put_line('此员工的信息如下:'||sp_record.name||'  工资:'||sp_record.sal);   
  11. end;   

  1. --表类型使用的案例(接受一个值)   
  2. declare   
  3. --定义一个table类型的变量,存放的类型是emp.ename%type   
  4. --使用的下标是整数型的   
  5. type sp_table_type is table of emp.ename%type index by binary_integer;   
  6. sp_table sp_table_type;   
  7. begin    
  8. --下标要对应才可以,可以自己定义,这样写只能取出一个记录   
  9. select ename into sp_table(0) from emp where empno=7788;   
  10. dbms_output.put_line('员工名'||sp_table(0));   
  11. end;    

 
--参照变量(使用最多的)****************************游标和对象类型
--一般都是用游标变量cursor
--案例1  写一个块 输入部门号得到所有所属部门人员的信息(姓名和工资)

  1. declare   
  2. --定义游标类型  sp_cursor   
  3. type sp_emp_cursor is ref cursor;   
  4. --定义游标变量   
  5. test_cursor sp_emp_cursor;   
  6. --定义变量接受姓名和工资   
  7. v_ename emp.ename%type;   
  8. v_sal emp.sal%type;   
  9. begin   
  10. --把一个游标和select结合   
  11. open test_cursor for select ename,sal from emp where deptno=&no;   
  12. --循环取出数据,循环结构使用loop结构   
  13. loop   
  14.   --fetch是取出游标的意思   
  15.    fetch test_cursor into v_ename,v_sal;   
  16.   --判断退出的条件,没有就是死循环了哦   
  17.    exit when test_cursor%notfound;   
  18.   --输出   
  19.    dbms_output.put_line('姓名:'||v_ename||'  工资:'||v_sal);   
  20. end loop ;   
  21. end ;   
  22. 结果  
  23.    
  24.     
  25. 姓名:ALLEN  工资:1600   
  26. 姓名:WARD  工资:1250   
  27. 姓名:MARTIN  工资:1250   
  28. 姓名:BLAKE  工资:2850   
  29. 姓名:TURNER  工资:1500   
  30. 姓名:JAMES  工资:950   
  31.     
  32. PL/SQL procedure successfully completed   

常用的就是标量 记录 和游标了。 只要能取到值,其他的业务逻辑就可以使用变量来实现了。

本文出自 orangleliu笔记本 博客,请务必保留此出处http://blog.csdn.NET/orangleliu/article/details/38309417

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多