[/color][color=orange]SQL> set serveroutput on
SQL> remark 控制语句
SQL> remark 异常处理
SQL> REMARK ..........................................................
SQL> REMARK IF...THEN 的判断语法
SQL> remark IF 条件标示式 WHEN 执行语句 END IF; 示例如下:
SQL> REMARK 使用分组函数 条件判断的按列
SQL> EDIT
Wrote file afiedt.buf
1 DECLARE
2 SUMSAL SCOTT.EMP.SAL%TYPE;
3 BEGIN
4 SELECT SUM(SAL) INTO SUMSAL FROM SCOTT.EMP GROUP BY DEPTNO HAVING DEPTNO=30;
5 IF SUMSAL>5000 THEN
6 DBMS_OUTPUT.PUT_LINE('部门30的工资总额已经超过了预算,供'||SUMSAL);
7 END IF;
8* END;
SQL> /
部门30的工资总额已经超过了预算,供9400
PL/SQL procedure successfully completed.
SQL> REMARK 如果存在了分支条件,使用 IF...ELSIF..ELSE...END IF;
SQL> REMARK 多元分支条件控制case
SQL> REMARK 连接scott账户
SQL> conn scott/tiger;
Connected.
SQL> DECLARE
2 THESAL EMP.SAL%TYPE;
3 BEGIN
4 SELECT SAL INTO THESAL FROM EMP WHERE EMPNO=7369;
5 CASE
6 WHEN THESAL<1000 THEN
7 DBMS_OUTPUT.PUT_LINE('低工资');
8 WHEN THESAL>=1000 THEN
9 DBMS_OUTPUT.PUT_LINE('一般工资');
10 ELSE
11 DBMS_OUTPUT.PUT_LINE('高工资');
12 END CASE;
13 END;
14 /
PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON;
SQL> REMARK 循环控制loop和end loop ; 之间的语句将无限次的执行,如果要跳出则使用exit;
SQL> remark 语法:loop exit when 条件表达式;执行语句 ; end loop;
SQL> remark 案例:累加的例子
SQL> declare
2 cou int default 10;
3 result int :=0;
4 begin
5 DBMS_OUTPUT.PUT_LINE('循环开始.....');
6 LOOP
7 EXIT WHEN COU>20;
8 result :=result + cou;
9
10 DBMS_OUTPUT.PUT_LINE('进入循环..'||cou||'结果是:'||result);
11 cou :=cou+1;
12 end loop;
13 dbms_output.put_line('最后的结果是:'||result);
14 end;
15 /
循环开始.....
进入循环..10结果是:10
进入循环..11结果是:21
进入循环..12结果是:33
进入循环..13结果是:46
进入循环..14结果是:60
进入循环..15结果是:75
进入循环..16结果是:91
进入循环..17结果是:108
进入循环..18结果是:126
进入循环..19结果是:145
进入循环..20结果是:165
最后的结果是:165
PL/SQL procedure successfully completed.
SQL> remark 循环控制还可以使用for 循环和while 进行循环,这两种循环都是以loop循环作为基础
SQL> remark 语法:for 变量 in 起始值..结束值 loop 执行语句; end loop;
SQL> remark 注:for循环的语法控制中,变量的定义不用声明,变量的边界值都会进入循环;.......
案例:
SQL> declare
2 result int :=0;
3 begin
4 dbms_output.put_line('循环开始...');
5 for cou in 10..20
6 loop
7 result :=result+cou;
8 dbms_output.put_line('进入循环..'||cou||'结果是:'||result);
9 end loop;
10 dbms_output.put_line('循环结束:'||result);
11 end;
进入循环..13结果是:46
进入循环..14结果是:60
进入循环..15结果是:75
进入循环..16结果是:91
进入循环..17结果是:108
进入循环..18结果是:126
进入循环..19结果是:145
进入循环..20结果是:165
循环结束:165
PL/SQL procedure successfully completed.
SQL> remark while 的循环用法
SQL> remark 语法:while 条件表达式 loop 执行语句; end loop;
SQL> remark ................................................................
SQL> remark 跳转控制:标示跳转的指令是 goto
SQL> remark 语法:执行语句 <<节名称>> 执行语句;
SQL> remark 如果只希望 节 作为一个跳转的点,并不执行任何语句,可以使用null,使用return 结束
程序
SQL> remark 跳转的案例:
SQL> declare
2 sumsal emp.sal%type;
3 begin
4 select sum(sal) into sumsal from emp where deptno=30;
5 if sumsal>2000 then
6 goto first;
7 elsif sumsal>3000 then
8 goto second;
9 else
10 goto third;
11 end if;
12
13 <<first>>
14 dbms_output.put_line('first'||sumsal);
15 return;
16 <<second>>
17 dbms_output.put_line('second'||sumsal);
18 return;
19 <<third>>
20 null;
21 end;
22 /
first9400
PL/SQL procedure successfully completed.
SQL> remark ................................................................
SQL> remark 记录:PS记录只有一行,但是由多列,有点类型于程序中的结构
SQL> remark 记录的定义:type <类型名> is record <列名 1 类型 1,....列名n 类型n,>
SQL> remark 案例:
SQL> edit;
Wrote file afiedt.buf
1 declare
2 type empsub is record (myeno emp.empno%type,myename emp.ename%type,mysa emp.sal
%type);
3 mycord empsub;
4 begin
5 select empno,ename,sal into mycord from emp where empno = 7369;
6 dbms_output.put_line('编号1:'||mycord.myeno);
7* end;
SQL> /
编号1:7369
PL/SQL procedure successfully completed.
SQL> remark empsub 定义了一种数据类型
SQL> remark..................................................................
SQL> remark 异常:一种为内部异常,一种为用户自定义异常;
SQL> remark PS中要捕获异常,必须使用系统所给的异常名称,而不是异常的编号;
SQL> declare
2 newsal emp.sal%type;
3 begin
4 select sal into newsal from emp where deptno = 30;
5 dbms_output.put_line('工资是:'||newsal);
6 exception
7 when too_many_rows then
8 dbms_output.put_line('数据插入记录太多');
9 end;
10 /
数据插入记录太多
PL/SQL procedure successfully completed.
SQL> remark 自定义异常
SQL> remark declare 异常名 exception; ----声明异常
SQL> remark raise 异常名; --抛出异常
SQL> remark exception when 异常名 then 。....-- 捕获异常 并进行相关的处理
SQL> remark RAISE_APPLICATION_ERROR(错误编码,错误消息);
SQL> remark 错误编码:用户为抛出异常指定的编号,-20000和-20999之间
SQL> remark 错误消息:是用户定义的错误的消息,消息的长度是2048;
SQL> declare
2 thesal emp.sal%type;
3 begin
4 select sal into thesal from emp where empno=7369;
5 if thesal>2000 then
6 raise_application_error(-20001,'工资不再调整的范围');
7 end if;
8 end;
9 /
PL/SQL procedure successfully completed.
SQL> remark ................................................................
SQL> remark 动态SQL ,动态的构造一个查询语句;语法:
SQL> remark execute immediate 'SQL语句字符串';
SQL> remark 创建一个表:
SQL> begin
2 execute immediate
3 'create table hopecalss(claid number,calName char(6))';
4 end;
5 /
PL/SQL procedure successfully completed.
SQL> remark 动态的SQL进行参数的传递 有时候进行结果的变量;
SQL> edit
Wrote file afiedt.buf
1 declare
2 sqlstring varchar2(200);
3 dept_id number(2):=50;
4 dept_name varchar(14):='personnel';
5 location varchar(13):='develop';
6 begin
7 --演示的是usingredients字句的execute immediate
8 sqlstring :='insert into dept values(:1,:2,:3)';
9 execute immediate sqlstring using dept_id,dept_name,location;
10* end;
11 /
PL/SQL procedure successfully completed.
SQL> spool off;
[color=orange][/color][size=x-small][/size]