if v_age >= 50 then
dbms_output.put_line('老年!'); elsif v_age>=30 then
dbms_output.put_line('状年!'); elsif v_age>=18 then
dbms_output.put_line('青年!'); else
dbms_output.put_line('未成年!'); end if; end;
--case子句:类似于switch DECLARE
grade varchar2(2); BEGIN
grade:='&grade'; CASE grade
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('优异'); WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE ('优秀'); WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE ('良好'); WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE ('一般'); WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE ('较差'); ELSE DBMS_OUTPUT.PUT_LINE ('没有此成绩'); END CASE; END;
--loop循环结构: do...while循环 --loop --循环体; -- exit when 条件 --end loop; declare
i binary_integer:=1; begin
loop
dbms_output.put_line('i='||i); i:=i+1;
exit when i>10; --满足条件推出循环 end loop; end;
--while循环结构:类似于while循环 --while 条件 --loop --循环体 --end loop;
declare
i binary_integer:=1; begin
while(i<=10) loop
dbms_output.put_line('i='||i); i:=i+1; end loop; end;
9.PL-SQL基础2
--动态SQL /*
动态 SQL 是指在PL/SQL程序执行时生成的 SQL 语句
编译程序对动态 SQL 不做处理,而是在程序运行时动态构造语句、对语句进行语法分析并执行
DDL 语句命令和会话控制语句不能在 PL/SQL 中直接使用,但是可以通过动态 SQL 来执行 执行动态 SQL 的语法:
EXECUTE IMMEDIATE dynamic_sql_string [INTO define_variable_list] [USING bind_argument_list]; */
--根据用户输入的员工编号,动态将该员工的编号和薪水插入到bound2表(动态创建)中 declare
v_emp_id number; v_sql varchar2(200); v_emp_rec emp%rowtype; begin
v_emp_id:='&empno';
--查询指定编号的员工信息
v_sql:='select * from emp where empno=:id';
execute immediate v_sql into v_emp_rec using v_emp_id;--将查询出的记录存放到v_emp_rec变量中
--动态创建bound2表
v_sql:='create table bound3(id number,sal number)'; execute immediate v_sql;--创建表
v_sql:='insert into bound3 values(:1,:2)';
execute immediate v_sql using v_emp_rec.empno,v_emp_rec.sal; end;
select * from bound3; --异常处理 declare
v_num1 number:=2;
v_num2 number:=0; v_result number; begin
v_result:= v_num1/v_num2; dbms_output.put_line(v_result);
exception when others then--Exception dbms_output.put_line('出错了.....'); end; declare
v_emp_id number; v_sal number; begin
select empno,sal into v_emp_id,v_sal from emp; dbms_output.put_line('v_emp_id='||v_emp_id); dbms_output.put_line('v_sal='||v_sal); exception when too_many_rows then dbms_output.put_line('error...'); end;
--自定义异常
declare
tel number(8);
invildNumber exception; begin
tel:='&tel';
if tel not in(12345678,87654321) then raise invildNumber; else
dbms_output.put_line(tel); end if;
exception when invildNumber then
--dbms_output.put_line('error...');
raise_application_error(-20001,'error....'); end;
10.游标
/*
游标:类似于jdbc中的ResultSet
逐行处理查询结果,以编程的方式访问数据 游标的类型:隐式游标,显示游标,Ref游标 隐式游标:
在PL/SQL中使用DML语句时自动创建隐式游标
隐式游标自动声明、打开和关闭,其名为 SQL
通过检查隐式游标的属性可以获得最近执行的DML 语句的信息 隐式游标的属性有:
%FOUND – SQL 语句影响了一行或多行时为 TRUE %NOTFOUND – SQL 语句没有影响任何行时为TRUE %ROWCOUNT – SQL 语句影响的行数 %ISOPEN - 游标是否打开,始终为FALSE */
declare
v_emp_id number; begin
v_emp_id:='&请输入编号';
update emp set sal=sal+10 where empno=v_emp_id; if SQL%FOUND then
dbms_output.put_line('受影响的行数'||SQL%ROWCOUNT); end if; end;
select * from emp; /*
显示游标
显式游标在 PL/SQL 块的声明部分定义查询,该查询可以返回多行 */
--使用loop循环遍历游标 declare
v_emp_rec emp%ROWTYPE;--用于保存一行数据 cursor my_cursor is select * from emp;--声明游标 begin
open my_cursor;--打开游标 loop
fetch my_cursor into v_emp_rec;--提取行 exit when my_cursor%NOTFOUND ;
dbms_output.put_line('姓名:'||v_emp_rec.ename); end loop;
close my_cursor;-- 关闭游标 end;
--使用while循环遍历游标
declare
v_emp_rec emp%ROWTYPE;--用于保存一行数据 cursor my_cursor is select * from emp;--声明游标 begin
open my_cursor;--打开游标 fetch my_cursor into v_emp_rec; while (my_cursor%FOUND)
loop
dbms_output.put_line('姓名:'||v_emp_rec.ename); fetch my_cursor into v_emp_rec;--提取行 --exit when my_cursor%NOTFOUND ; end loop;
close my_cursor;-- 关闭游标 end;
--使用for循环,不需要打开和关闭游标 declare
v_emp_rec emp%ROWTYPE;--用于保存一行数据 cursor my_cursor is select * from emp;--声明游标 begin
for v_emp_rec in my_cursor loop
dbms_output.put_line('姓名:'||v_emp_rec.ename); end loop; end;
11.游标2
--带参数的游标 declare
v_sal emp.sal%type;
v_emp_rec emp%rowtype;
cursor cur(salpara number) is select * from emp where sal < salpara; --声明带参数的游标 begin
v_sal:='&sal';
for v_emp_rec in cur(v_sal)
loop
dbms_output.put_line(v_emp_rec.ename||'--'||v_emp_rec.sal); end loop; end;
select * from emp where sal<1500
--使用游标更新(薪水<1500员工,加薪100) declare
v_sal number;
cursor cur is select sal from emp where sal < 1500 for update; begin
open cur; loop
fetch cur into v_sal;
exit when cur%NOTFOUND ;
dbms_output.put_line('sal:'||v_sal);
update emp set sal=v_sal+100 where current of cur;--使用当前的游标作为条件