pl

mac2024-05-30  37

1、条件控制语句:

IF <布尔表达式> THEN PL/SQLSQL 语句; END IF; IF <布尔表达式> THEN PL/SQLSQL 语句; ELSE 其它语句; END IF; IF <布尔表达式> THEN PL/SQLSQL 语句; ELSIF < 其它布尔表达式> THEN 其它语句; ELSIF < 其它布尔表达式> THEN 其它语句; ELSE 其它语句; END IF; 提示: ELSIF 不能写成 ELSEIF declare v_grade Salgrade.grade%type; begin select grade into v_grade from Salgrade where losal=2001; if v_grade < 4 then DBMS_OUTPUT.PUT_LINE('等级小于4'); elsif v_grade > 4 then DBMS_OUTPUT.PUT_LINE('等级大于4'); else DBMS_OUTPUT.PUT_LINE('=4'); end if; end;

2、loop循环

循环知识:

1. 简单循环: LOOP 要执行的语句; 2. WHILE 循环(相较 1,推荐使用 2) WHILE <布尔表达式> LOOP 要执行的语句; END LOOP; 3. 数字式循环 FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP 要执行的语句; END LOOP; 每循环一次,循环变量自动加 1;使用关键字 REVERSE,循环变量自动减 1。跟在 IN REVERSE 后面的 数字必 须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用 EXIT 退出循环

2.1 简单循环:

declare v_seq varchar(3):=1; begin loop dbms_output.put_line(v_seq); v_seq:=v_seq+1; exit when v_seq > 100; end loop; end;

2.1 for_loop循环

/* FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP 要执行的语句; END LOOP; */ /*每循环一次,循环变量自动加 1; 使用关键字 REVERSE,循环变量自动减 1。 跟在 IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。 可以使用 EXIT 退出循环 */ declare v_seq varchar(3):=1; --声明变量赋初值 begin for v_seq in 1..100 loop --条件控制,后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式 dbms_output.put_line(v_seq); --循环体 end loop; --结束循环 end;

2.2 while_loop循环

declare v_seq varchar(3):=1; begin while v_seq>100 loop dbms_output.put_line(v_seq); v_seq:=v_seq+1; end loop; end;

3.游标的使用

在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现 3.1显示游标的使用+while_loop循环

declare --1.定义游标 cursor xh_cursor is select empno,sal from emp; --定义变量 v_empno number(10); v_sal number(10); begin --2.打开游标 open xh_cursor; --3.提取游标数据 fetch xh_cursor into v_empno,v_sal; while xh_cursor %found loop dbms_output.put_line(v_empno||', '||v_sal); fetch xh_cursor into v_empno,v_sal; end loop; --4.关闭游标 close xh_cursor; end;

3.2显示游标的使用+for_loop循环

declare --声明记录类型: type xiehao_record is record( v_job varchar(10), v_mgr number(10)); --声明记录类型变量: v_xh xiehao_record; --定义游标: cursor emp_cursor is select job,mgr from emp order by mgr desc; --块开始: begin --打开游标: open emp_cursor; --for...loop循环 for i in 1..3 loop --提取游标: fetch emp_cursor into v_xh; --打印输出内容: DBMS_OUTPUT.PUT_LINE (v_xh.v_job||','||v_xh.v_mgr); --结束循环: end loop; --关闭游标 close emp_cursor; end;

3.3显示游标的使用+记录类型+for_loop循环

declare --声明记录类型: type xiehao_record is record( v_job varchar(10), v_mgr number(10)); --声明记录类型变量: v_xh xiehao_record; --定义游标: cursor emp_cursor is select job,mgr from emp order by mgr desc; --块开始: begin --打开游标: open emp_cursor; --for...loop循环 for i in 1..3 loop --提取游标: fetch emp_cursor into v_xh; --打印输出内容: DBMS_OUTPUT.PUT_LINE (v_xh.v_job||','||v_xh.v_mgr); --结束循环: end loop; --关闭游标 close emp_cursor; end;

3.4 显式游标_配合 if 流程控制_while_loop循环,调整员工工资

/* 利用游标, 调整公司中员工的工资: 工资范围 调整基数 0 - 1000 5% 1000 - 30000 3% 3000 - 4000 2% 4000 - 1% */ declare --1.定义游标 cursor xh_cursor is select empno,sal from emp; --定义存放游标值的变量 v_empno emp.empno%type; v_sal emp.sal%type; --定义工资调整基数变量 v_tmp number(5,2); begin --2.打开游标 open xh_cursor; --3.提取游标数据 fetch xh_cursor into v_empno,v_sal; while xh_cursor%found loop if v_sal<1000 then v_tmp:=0.05; elsif v_sal>=1000 and v_sal<3000 then v_tmp:=0.03; elsif v_sal>=3000 and v_sal<4000 then v_tmp:=0.02; else v_tmp:=0.01; END IF; --更新数据库的数据 update emp set sal=sal*(1+v_tmp); --打印更新后的数据 dbms_output.put_line(v_empno||', '||v_sal); fetch xh_cursor into v_empno,v_sal; end loop; --4.关闭游标 close xh_cursor; end;

3.5 显式游标_配合 if 流程控制_for_loop循环,调整员工工资

/* 利用游标, 调整公司中员工的工资: 工资范围 调整基数 0 - 1000 5% 1000 - 30000 3% 3000 - 4000 2% 4000 - 1% */ declare --1.定义游标 cursor xh_cursor is select empno,sal from emp; --定义存放游标值的变量 v_empno emp.empno%type; v_sal emp.sal%type; --定义工资调整基数变量 v_tmp number(5,2); begin /* --2.打开游标 open xh_cursor; --3.提取游标数据 fetch xh_cursor into v_empno,v_sal; */ for i in xh_cursor loop if i.sal<1000 then v_tmp:=0.05; elsif i.sal>=1000 and i.sal<3000 then v_tmp:=0.03; elsif i.sal>=3000 and i.sal<4000 then v_tmp:=0.02; else v_tmp:=0.01; end if; --更新数据库的数据 update emp set sal=sal*(1+v_tmp); --打印更新后的数据 dbms_output.put_line(v_empno||v_sal); --fetch xh_cursor into v_empno,v_sal; end loop; --4.关闭游标 --close xh_cursor; end;

4.处理隐式游标

最新回复(0)