打印1-10。
declare
i number:=1;
begin
while i<=10 loop
dbms_output.put_line(i);
i:=i+1; --pl/sql没有++和--
end loop;
end;
/
begin
for i in 1..10 loop
dbms_output.put_line(i);
end loop;
end;
/
declare
i number:=1;
begin
loop
exit when i>10;
dbms_output.put_line(i);
i:=i+1;
end loop;
end;
/
游标(光标,cursor,结果集,(ResultSet)):结果的集合
cursor 光标的名字;
对比:pname varchar2(20)的书写顺序
查询员工表中所有员工的姓名和工资。
declare
pname briup_emp.ename%type;
psal briup_emp.sal%type;
--定义光标
cursor cemp is select ename,sal from briup_emp;
begin
--开启光标
open cemp;
--loop循环
loop
fetch cemp into pname psal;
exit when cemp%notfound;
dbms_output.put_line(pname||'的工资是'||psal);
end loop;
--关闭光标
close cemp;
end;
/
fetch:
1、指针指向的数据返回
2、指针指向下一条数据
declare
cursor cemp is select empno,sal,job from briup_emp;
pempno briup_emp.empno%type; psal briup_emp.sal%type; pjob briup_emp.job%type;
begin
open cemp;
loop
fetch cemp into pname psal pjob;
exit when cemp%notfound;
if pjob='android' then update briup_emp set sal:=psal+1000 where empno=pempno;
elsif pjob='ios' then update briup_emp set sal:=sal+500 where empno=pempno ;
else update briup_emp set psal:=psal+2000 where empno=pempno;
end if;
end loop;
close cemp;
end;
/
例外:和java中的异常
预定义例外
no_data_found 没有找到数据
too_many_rows 匹配了多个行
zero_divide 除数为0
value_error 数据类型转型失败,如:'abc'转化为数字失败
timeout_on_resource (资源连接超时)
自定义例外
案例:模拟no_data_found例外。
declare
pname briup_emp.ename%type;
begin
select ename into pname from briup_emp where empno=100;
--有异常执行
exception
when no_data_found then dbms_output.put_line('没有找到这个结果');
when others then dbms_output.put_line('出现了其他例外');
end;
/
pl/sql的存储过程
指存储在数据库中供所有用户调用的子程序。
过程是一个被命名的pl/sql代码块。它既可以没有参数,也可以没有参数,既可以in参数,也可以有out参数,但它没有返回值,过程一旦被创建好,就会储存到数据库中。过程是不能被普通的sql语句调用的,第一个调用方式通过execute或者在pl/sql代码块调用,因为过程是提前编译好的代码,所以执行效率很高。
create [or replace] procedure pro_name[(参数列表 参数类型 数据类型)]
is|as --指过程的开始,说明部分(相对于declare,定义)
begin
end;
/
通过过程打印helloworld。
create or replace procedure dbms_helloworld
is
begin
dbms_output.put_line('helloworld');
end;
/
create or replace procedure insert_emp
is
begin
insert into briup_emp(ename) valus('胡八一');
end;
/
--commit不应该写在过程中,因为是否提交应该由调用者处理。
向过程中添加参数(通过编号查询名字)
create or replace procedure select_emp_by_empno(eno in number)
is
pname briup_emp.ename%type;
begin
insert ename into pname from briup_emp where empno=eno;
end;
/
exec select_emp_by_empno(2);
向过程中输出参数(通过编号查询工种和工资)
create or replace procedure select_emp_by_empno(eno in number)
is
pjob briup_emp.ename%type;
psal briup_emp.ename%type;
begin
select job,sal into pjob,psal from briup_emp where empno=eno;
dbms_output.put_line(eno||'号员工的工种是'||pjob);
end;
/
create or replace procedure select_emp_by_empno(eno in number,
ejob out varchar(2),
esal out number)
is
begin
select job,sal into pjob,psal from briup_emp where empno=eno;
end;
/
declare
pjob briup_emp.ename%type;
psal briup_emp.ename%type;
begin
select_emp_by_empno(1,pjob,psal);
dbms_output.put_line(pjob psal);
end;
/
删除过程:drop procedure pro_name;
pl/sql的存储函数
函数一般用于计算或者返回一个值,函数在创建的时候和过程很相似,调用的时候需要表达式,函数必须有返回值。
create [or replace] function fun_name[(参数列表 参数类型 数据类型)]
return 返回值类型
is|as
begin
...
return 结果;
[exception]
end;
/
计算一个员工的年工资。
create or replace function year_salary(eno in number)
return number
is
pys number(10);
begin
select sal*12 into pys from briup_emp where empno=eno;
return pys;
end;
/
declare
pyear_sal number(10);
begin
pyear_sal:=year_salary(1);
dbms_output.put_line('年薪是'||pyear_sal);
end;
/
删除函数:drop function fun_name;
相同点:都是执行某个功能的代码块。
不同点:过程没有return,函数有return。