1.PL/SQL编程语言(划重点)
PL/SQL是Oracle对sql语言的过程化扩展,指在sql命令中增加了过程处理语句(分支、循环等)使sql具有了逻辑判断的能力
1>基础语法:
--基础语法
declare --说明部分
begin --程序开始
dbms_output.put_line('Hello World');--打印语句,逻辑处理部分
end; --程序结束
2>说明变量:char、varchar2,date,number,boolean,long
--常量和变量的定义
declare
varl varchar2(20) :='aa';--定义语句(变量名 类型)
married boolean :=true;--赋值语句:=
psal number(7,2) :=12.20;
my_name emp.ename%type :='bb';--引用类型,此处的类型为emp表中ename的类型
emp_rec emp%rowtype;--记录型变量,相当于emp表的一整行
begin
select * into emp_rec from emp where ename='SCOTT';--另一种赋值方式 into变量名
dbms_output.put_line(varl);
dbms_output.put_line(psal);
dbms_output.put_line(my_name);
dbms_output.put_line(emp_rec.ename||'he money is'||emp_rec.sal);
end;
3>if语句
--if语句
--accept num prompt '请输入一个数字';--接受键盘输入
--num:是一个地址值,在该地址上保存了输入的值
declare
pnum number := 0;
begin
if pnum = 0 then dbms_output.put_line('is 0');
elsif pnum = 10 then dbms_output.put_line('is 10');
elsif pnum = 20 then dbms_output.put_line('is 20');
else dbms_output.put_line('is 30');
end if;--结束if
end;
4>循环
--循环,打印1~10
declare
pnum number := 1;--定义变量
begin
loop
exit when pnum>10;--退出条件
dbms_output.put_line(pnum);
pnum := pnum + 1;
end loop;--结束循环
end;
5>游标(光标)
相当于java中的ResultSet(返回结果集),PL/SQL中用到多条记录时使用可以返回多条数据
光标的属性:%isopen %rowcount(影响的行数) %found %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;
带参数光标
-- 查询某个部门的员工姓名
declare
--形参
cursor cemp(dno number) is select ename from emp where deptno=dno;
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;
/
6>例外(异常)
异常时程序设计语言提供的一种功能,用来增强程序的健壮性和容错性
异常:系统异常,自定义异常
常见异常类型:no_data_found(没有找到数据),too_many_rows(select ..into匹配多个行),zero_divide(被零除),value_error (算术或者转换错误),timeout_on_resource(等待资源时超时)
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;
/
7>存储过程Procedure
是在大型数据库中一组为了完成特定功能的SQL语句,经编译后存储在数据库中,存储过程也就是一段特定的PL/SQL代码
create or replace procedure sayhelloworld
as
--说明部分
begin
dbms_output.put_line('Hello World');
end;
/
8>存储函数Function
与存储过程类似,但存储函数具有一个返回值,在返回多个值时使用存储过程(使用输出函数out返回),返回一个值时使用存储函数
注意:一般来讲过程和函数的区别在于函数可以有一个返回值;而过程没有返回值。但是过程和函数都可以通过out指定一个或多个输出参数从而实现返回多个值
--查询某个员工的年收入
create or replace function queryEmpIncome(eno in number)
return number
is
--定义变量保存月薪和奖金
psal emp.sal%type;
pcomm emp.comm%type;
begin
--得到月薪和奖金
select sal,comm into psal,pcomm from emp where empno=eno;
--返回年收入
return psal*12+nvl(pcomm,0);
end queryEmpIncome;
/
带参数的存储函数
--给指定的员工涨100,并且打印涨前和涨后的薪水
create or replace procedure raiseSalary(eno in number)
is
--定义变量保存涨前的薪水
psal emp.sal%type;
begin
--得到涨前的薪水
select sal into psal from emp where empno=eno;
--涨100
update emp set sal=sal+100 where empno=eno;
--不用commit,谁调用谁commit
dbms_output.put_line('涨前:'||psal||' 涨后:'||(psal+100));
end raiseSalary;
/