Oracle学习(十一):PL/SQL(二)

2014-11-24 09:09:07 · 作者: · 浏览: 6
----------------------------------- ----------- -------- cursor_sharing string EXACT cursor_space_for_time boolean FALSE open_cursors integer 300 session_cached_cursors integer 20 */ set serveroutput on declare --光标代表员工 cursor cemp is select empno,job from emp; pempno emp.empno%type; pjob emp.job%type; begin open cemp; loop fetch cemp into pempno,pjob; exit when cemp%notfound; --判断 if pjob = 'PRESIDENT' then update emp set sal=sal+1000 where empno=pempno; --总裁涨1000 elsif pjob = 'MANAGER' then update emp set sal=sal+800 where empno=pempno; --经理涨800 else update emp set sal=sal+400 where empno=pempno; --其他涨400 end if; end loop; close cemp; --提交: 隔离级别 commit; dbms_output.put_line('完成'); end; / ------------------------------------------------------------------ --带参数的光标:查询某个部门的员工姓名 set serveroutput on declare --定义一个带参数的光标 cursor cemp(pdno number) is select ename from emp where deptno=pdno; pename emp.ename%type; begin open cemp(20); --打开光标,并传递参数 loop fetch cemp into pename; exit when cemp%notfound; dbms_output.put_line(pename); end loop; close cemp; end; / ------------------------------------------------------------------ Oracle的异常处理 1.系统定义例外 No_data_found (没有找到数据) Too_many_rows (select …into语句匹配多个行) Zero_Divide ( 被零除) Value_error (算术或转换错误) Timeout_on_resource (在等待资源时发生超时) --举例 Zero_Divide ( 被零除) set serveroutput on declare pnum number; begin pnum := 1/0; exception when Zero_Divide then dbms_output.put_line('1: 0不能做被除数'); dbms_output.put_line('2: 0不能做被除数'); when Value_error then dbms_output.put_line('算术错'); when others then dbms_output.put_line('其他例外'); end; / 用户自己定义的例外 --自定义例外: 查询50号部门的员工姓名 set serveroutput on declare cursor cemp is select ename from emp where deptno=50; pename emp.ename%type; --自定义例外 no_emp_found exception; begin open cemp; --取一个员工 fetch cemp into pename; if cemp%notfound then raise no_emp_found; end if; /* if cemp%isopen then close no_emp_found; end if; */ close cemp; exception when no_emp_found then dbms_output.put_line('没有找到员工'); when others then dbms_output.put_line('其他例外'); end; /

\

图:循环的3种写法,文中采用右上角的方法。

2.在Sqlplus下实际执行的结果录屏

SQL> --第一个PL/SQL程序:HelloWorld
SQL> set serveroutput on	--如果要在屏幕上输出信息,需要将serveroutput开关打开
SQL> declare
  2    --变量的说明
  3  begin
  4     --程序体
  5     --程序包package
  6     dbms_output.put_line('Hello World');
  7  end;
  8  /
 
Hello World
 
PL/SQL procedure successfully completed
 
SQL> 
SQL> --引用型变量: 查询并打印7839的姓名和薪水
SQL> set serveroutput on
SQL> declare
  2    --定义变量,
  3    pename emp.ename%type;		--将pename的类型设置为emp表中ename的类型
  4    psal   emp.sal%type;	--将psal的类型设置为emp表中sal的类型
  5  
  6  begin
  7  
  8    --查询:
  9    --ename,sal into pename,psal:将查询的ename,sal分别赋值给pename,psal按顺序赋值
 10    select ename,sal into pename,psal from emp where empno=7839;
 11  
 12    --打印
 13    dbms_output.put_line(pename||'的薪水是'||psal);
 14  
 15  end;
 16  /
 
KING的薪水是5000
 
PL/SQL procedure successfully completed
 
SQL> 
SQL> -记录型变量 查询并打印7839的姓名和薪水
SQL> set serveroutput on
SQL> declare
  2    --定义变量,代表一行
  3    emp_rec emp%rowtype;
  4  begin
  5    --得到一行,赋值给emp_rec
  6    select * into emp_rec from emp where empno=7839;
  7  
  8    dbms_output.put_line(emp_rec.ename||'