PL/SQL(Procedure Language/SQL)
PL/SQL是Oracle对sql语言的过程化扩展,在sql命令语言中增加了过程处理语句(分支,循环等),使sql语言具有过程处理能力。把sql语言的数据操作能力与过程语言的数据处理能力结合起来,是的PLSQL面向过程但比过程语言简单,高效,灵活。
PL/SQL的语法
declare
--说明部分(变量说明,光标申明,列外说明)
begin
--语句序列(DNL语句)
exception
--列外处理语句
END;
1,打印hello world
declare
--说明部分
begin
--程序
dbms_output.put_line("hello world");
end;
2,引用型变量
--查询并打印7839的姓名和薪水
declare
--定义变量保存姓名和薪水
--pename varchar2(20);
--psal number;
pename emp.ename%type;
psal emp.sal%type;
begin
--得到7839的姓名和薪水
select ename,sal into pename,psal from emp where empno=7839;
--打印
dbms_output.put_line(pename||'的薪水是'||psal);
end;
3,记录行变量
--查询并打印7839的姓名和薪水
declare
--定义记录行变量:代表一行
emp rec_emp%rowtype;
begin
select * into emp_rec from emp where empno=7839;
dbms_output.put_line(emp_rec.ename||'的薪水是'||emp._rec.sal);
end;
4,循环
--打印1~10
declare
--定义变量
pnum number :=1;
begin
loop
--退出条件
exit when pnum > 10;
--打印
dbms_output.put_line(pnum);
--+1
pnum := pnum +1;
end loop;
end;
5,光标(游标)
光标(游标)就类似与java中的集合,它可以存储查询返回的多条数据。
语法:
cursor 游标名 [(参数名 数据类型,参数名 数据类型…)] is select …;
例如:
cursor c1 is select ename from emp;
游标的使用步骤:
- 打开游标: open c1; (打开游标执行查询)
- 取一行游标的值:fetch c1 into pjob; (取一行到变量中)
- 关闭游标:close c1; (关闭游标释放资源)
- 游标的结束方式:exit when c1%notfound
例: 查询并打印员工的姓名和薪水
declare
--定义光标
cursor cemp is select ename,sal from emp;
pename emp.ename%type;
psal emp.sal%type;
begin
--打开
open cemp;
loop
--取当前记录
fetch cemp into pename,psal;
--exit when 没有取到记录;
exit when cemp%notfound;
dbms_output.put_line(pename||'的薪水是'||psal);
end loop;
--关闭
close cemp;
end;
例外(异常)
- no_data_found (没有找到数据)
- too_many_rows (select…into语句匹配多个行)
- zero_divide (被零除)
- value_error (算术或转换错误)
- timeout_on_resource (在等待资源是发生超时)
自定义例外
--查询50号部门的员工
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;
--进程:pmon进程(proccesss monitor)
close cemp;
exception
when no_emp_found then dbms_output.put_line(“没有找到员工”);
when others then dbms_output.put_line("其他例外")
end;