四.使用PL/SQL
可用于创建存储过程,触发器,程序包,给SQL语句的执行添加程序逻辑。
支持SQL,在PL/SQL中可以使用:
数据操纵命令
事务控制命令
游标控制
SQL函数和SQL运算符
支持面向对象编程(OOP)
可移植性
更佳的性能,PL/SQL经过编译执行
分为三个部分:声明部分,可执行部分和异常处理部分
[declare
declarations]
begin
executable statements
[exception
handlers]
end;
打开输出
set serverout on;
--根据输入编号获取某学员的成绩--if
declare
score user_tbl.score%type;
begin
select score into score from user_tbl where id='&id';
if score>90 then
dbms_output.put_line('优秀');
elsif score>80 then
dbms_output.put_line('良好');
elsif score>60 then
dbms_output.put_line('及格');
else
dbms_output.put_line('差');
end if;
end;
--根据学员姓名获取某学员的成绩--if
declare
score user_tbl.score%type;
begin
select score into score from user_tbl where user_name='&name';
if score>90 then
dbms_output.put_line('优秀');
elsif score>80 then
dbms_output.put_line('良好');
elsif score>60 then
dbms_output.put_line('及格');
else
dbms_output.put_line('差');
end if;
end;
--case的使用
declare
grade user_tbl.grade%type;
begin
select grade into grade from user_tbl where id='&id';
case grade
when 'A' then dbms_output.put_line('优异');
when 'B' then dbms_output.put_line('优秀');
when 'C' then dbms_output.put_line('良好');
else dbms_output.put_line('一般');
end case;
end;
--基本循环
declare
i number(4):=1;
begin
loop
dbms_output.put_line('loop size:'||i);
i:=i+1;
exit when i>10;
end loop;
end;
--while循环
declare
i number(4):=1;
begin
while i<=10 loop
dbms_output.put_line('while loop size='||i);
i:=i+1;
end loop;
end;
--for循环
declare
i number(4):=1;
begin
for i in 1..10 loop
dbms_output.put_line('for loop Size:'||i);
end loop;
end;
declare
i number(2):=1;
j number(2):=1;
begin
for i in reverse 1..9 loop
for j in 1..i loop
dbms_output.put(j||'x'||i||'='||j*i||' ');
end loop;
dbms_output.put_line('');
end loop;
end;
--动态SQL
declare
userId number(2);
sql_str varchar2(100);
userName user_tbl.user_name%type;
begin
execute immediate 'create table testExe(id number,test_name varchar2(20))';
userId:='&userId';
sql_str:='select user_name from user_tbl where id=:id';
execute immediate sql_str into userName using userId;
dbms_output.put_line(userName);
end;
(or
declare
id_param number:='&id_param';
sql_str varchar2(100);
name_param stu_tbl.stu_name%type;
begin
sql_str:='select stu_name from stu_tbl where id=:p';
execute immediate sql_str into name_param using id_param;
dbms_output.put_line(name_param);
end;
/
)
--异常处理
declare
grade number(4);
begin
grade:='&grade';
case grade
when 1 then dbms_output.put_line('好的');
--else dbms_output.put_line('不好');
end case;
exception
when case_not_found then
dbms_output.put_line('输入类型不匹配!');
end;
--系统异常
declare
rowD user_tbl%rowtype;
begin
select * into rowD from user_tbl;
dbms_output.put_line(rowD.id||''||rowD.user_name||' '||rowD.password);
exception
when too_many_rows then
dbms_output.put_line('不能将多行赋予一个属性!');
end;
or
declare
rowD user_tbl%rowtype;
begin
select * into rowD from user_tbl where id=5;
dbms_output.put_line(rowD.id||' '||rowD.user_name||' '||rowD.password);
exception
when too_many_rows then
dbms_output.put_line('不能将多行赋予一个属性!');
when no_data_found then
dbms_output.put_line('没有您要查找的数据!');
end;
--自定义错误
declare
invalidError exception;
category varchar2(20);
begin
category:='&category';
if category not in('附件','顶盘','备件') then
raise invalidError;
else
dbms_output.put_line('您输入的类别是:'||category);
end if;
exception
when invalidError then
dbms_output.put_line('无法识别的类别!');
end;
--引发应用程序异常
declare
app_exception exception;
grade user_tbl.grade%type;
begin
select grade into grade from user_tbl where id=&id;
if grade='A' then
raise app_exception;
else
dbms_output.put_line('查询的等级为:'||grade);
end if;
exception
when app_exception then
raise_application_error(-20001,'未知的等级!');
end;