----------------------------------- ----------- --------
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||'