浅谈PL/SQL语言基础
在前面的学习中,我们大部分接触的都是SQL语言,但是,在实现复杂操作的时候,SQL语言就无能为力了,这时候就需要引入新的语言,PL/SQL语言就是对SQL语言的扩展,可以实现存储过程,函数等的创建。下面是我对PL/SQL语言的总结,和大家分享一下。
一.基本结构
1.PL/SQL是一种块结构的语言,它将一组语句放在一个块中,一次性发送给服务器,当PL/SQL引擎分析收到PL/SQL语句块中的内容,把其中的过程语句由PL/SQL引擎自身去执行,把PL/SQL语句块中的SQL语句交给服务器的SQL语句去执行。
2.PL/SQL的块都是由声明变量(可省略),程序代码(必填)和异常处理(可省略)组成。
代码结构:declare
变量声明
begin
程序体
exception
异常处理
end;
示例一
set serveroutput on; --打开控制台输出,切记,不能在该语句后面写注释,否则报错。 declare str varchar(20):='Hello World!'; begin dbms_output.put_line(str); end;
3.PL/SQL中常量和变量的声明
1>常量(使用constant关键字)
示例:declare num constant int:=1;
2>变量(参照(2)中的declare介绍)
4.特殊的变量类型
1>%type
set serveroutput on; declare cname bank.customername%type; --cname类型和bank表中的customername的类型一样 begin select customername into cname from bank where customername='李四'; dbms_output.put_line(cname); end;
2>%rowtype
set serveroutput on; declare recordbank bank%rowtype; --引用bank表中一行数据类型,即recordbank可以存放bank表中的一条数据 begin select * into recordbank from bank where customername='李四'; dbms_output.put_line(recordbank.customername||'存款为'||recordbank.currentmoney); end;
5.接收用户的输入
set serveroutput on; declare str varchar(20); begin str:=&age; dbms_output.put_line(str); end;
6.从查询结果中赋值(使用into关键字)
set serveroutput on; declare cname bank.customername%type; --cname类型和bank表中的customername的类型一样 begin select customername into cname from bank where customername='李四'; dbms_output.put_line(cname); end;
二.流程控制语句
PL/SQL的流程控制语句和我们常用的java等语言原理相同,除了使用时的方法略有不同,下面仅列出PL/SQL中使用方法和其他语言不同的流程控制语句。
set serveroutput on; declare num int :=# begin --判断if正确则执行then,否则执行else(elsif为嵌套判断) if num>0 then dbms_output.put_line('输入数字大于零'); elsif num=0 then --注意elsif,里面少一个e dbms_output.put_line('输入数字等于零'); else dbms_output.put_line('输入数字小于零'); end if; end;
set serveroutput on; declare num int ; i int; begin --有逻辑的从数值中做出选择 num:=(case when 1=2 then 11 else 22 end); i:=(case num when 11 then 111 when 22 then 222 else 0 end); dbms_output.put_line('num'||num||',i为'||i); end;
set serveroutput on; declare ssum int :=0; i int :=1; begin loop ssum := ssum+i; i:=i+1; if i>5 then exit; end if; end loop; dbms_output.put_line('1+2+3+4+5='||ssum); end;
set serveroutput on; declare ssum int :=0; i int :=1; begin loop ssum := ssum+i; i:=i+1; exit when i>5; end loop; dbms_output.put_line('1+2+3+4+5='||ssum); end;
set serveroutput on; declare ssum int :=0; i int :=1; begin while i<=5 loop ssum := ssum+i; i:=i+1; end loop; dbms_output.put_line('1+2+3+4+5='||ssum); end;
set serveroutput on; declare ssum int :=0; begin for i in 1..5 loop --i不用声明定义,并且不用i:=i++; ssum := ssum+i; end loop; dbms_output.put_line('1+2+3+4+5='||ssum); end;
三.异常处理
1.格式
EXCEPTION
WHEN <异常情况名> THEN
<异常处理代码>
WHEN <异常情况名> THEN
<异常处理代码>
WHEN OTHERS THEN
<异常处理代码>
示例
set serveroutput on; declare recordbank bank%rowtype; begin select * into recordbank from bank where customername='王柳'; exception when no_data_found then dbms_output.put_line('没有找到该客户'); when others then dbms_output.put_line('其他错误'); end;
2.常见异常
异常 | 说明 |
CURSOR_ALREADY_OPEN | 用户试图重新打开已经打开的游标时出现 |
INVALID_CURSOR | 在执行非法游标运算(如fetch一个尚未打开的游标)时出现 |
NO_DATA_FOUND | 没有找到数据 |
TOO_MANY_ROWS | 执行select语句时返回多行 |
VALUE_ERROR | 在产生大小限制时出现,如变量中的列值超出变量的大小 |
ZERO_DIVIDE | 以零做除数时出现 |
3.自定义异常
set serveroutput on; declare myException exception; begin update bank set customername = '王柳' where customername='李亮'; if SQL%NOTFOUND then raise myException; end if; exception when myException then dbms_output.put_line(SQLCODE||' errer '||SQLERRM); end;
4.重新定义系统异常
set serveroutput on; declare myException EXCEPTION; begin update bank set customername = '王柳' where customername='李亮'; if SQL%NOTFOUND then --调用系统的异常处理,抛出异常 RAISE_APPLICATION_ERROR(-20001,'can not found any row!'); end if; EXCEPTION when myException then dbms_output.put_line('user errors'); when others then dbms_output.put_line('Others '||SQLCODE||' '||SQLERRM); end;