PL/SQL 中的错误 及PL/SQL中的控制语句

PL/SQL 中的异常 及PL/SQL中的控制语句
[/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]