plsql基础———块结构

块结构

声明部分DECLARE

声明变量,常量和游标,注释

变量

  • 变量发挥的是承上启下的作用
  • 一个变量只能存放一个数据
 --声明变量
 declear
 v_sal number(10);
 v_job varchar2(10);
 --变量名+数据类型
 --多个变量用分号隔开

常量

关键字:constant

  • 只能在声明中赋值,不能再begin 中赋值
  • 必须在声名中赋给初始值
declare
con_name constant varchar2(10):='smith';

游标

  • 游标一次只能巡检一行数据
  • 游标巡检的结果暂时存在游标中,但它一次只能读取一行数据,所以可以赋给与结果集同结构的变量
  • 游标后面括号里面的数据类型不能指定长度
  • 当游标后面声明变量后,可以在下面打开游标的时候对这个变量赋值
  • 因为游标后面声明的变量是形参,所以如果下面赋值,以打开游标时的赋值为准
DECLARE
  CURSOR CUR_A (a number:=100)IS SELECT * FROM EMP WHERE DEPTNO = 10;--声明游标
  V_A EMP%ROWTYPE;--声明变量
BEGIN
  OPEN CUR_A(20);--打开游标
  --y
    LOOP
      FETCH CUR_A INTO V_A;--读取游标
      EXIT WHEN CUR_A%NOTFOUND;--判断循环
      DBMS_OUTPUT.PUT_LINE(V_A.EMPNO||V_A.ENAME||V_A.JOB);
    END LOOP;
  CLOSE CUR_A;--关闭游标
END;
声明游标

关键字:CURSOR

declare
v_empno number:=&员工编号
cursor cu_name is select * from emp where empno=v_empno;--is后面跟着结果集
v_cu emp%rowtype--变量类型与结果集的结构类型一致
--声明的时候结果集中的变量声明必须在游标之前

declare
cursor cu_name (v_empno number)is select * from emp where empno=v_empno;
--游标后面括号里面的数据类型不能指定长度
v_cu emp%rowtype
open cu_name(1001)

变量类型与结果集的结构类型一致

打开游标
OPEN CUR_A;   

打开游标的时候,游标指向第一行上面,直到遇到fetch向下走一行,才指向第一行

读取游标

关键字:fetch into

FETCH cu_name INTO V_cu;
--往下走一行,取这一行的数据,赋给变量
--若取数的时候当前行没有数据,则把上一行的数据赋给变量
关闭游标

关键字close

 CLOSE Cu_name;
游标属性

一般用于作为循环控制条件

  • %FOUND:判断是否从结果集中提取了数据。当游标中有可以提取的数据时返回True,没有的时候返回False。
  • %ISOPEN:判断对应的游标变量是否打开,如果游标变量打开,则返回True;否则返回False。
  • %NOTFOUND:当没有从游标中提取到数据时,返回True,否则返回False。
  • %ROWCOUNT:用于返回到目前为止从游标中提取到的记录的行数。初始值是0,每提取一条数据%ROWCOUNT值会加1
EXIT WHEN CUR_A%NOTFOUND;
判断当前行是否有数据 ,有则条件不成立,没有条件成立

执行部分BEGIN END

从begin 开始

若无异常

在end结束

begin 和end 成对出现

end后面加;

begin end 里面可以嵌套


异常处理部分EXCEPTION

写在 begin end中间

若有异常,则以exception结束

若无异常,则以end结束

预定义异常

异常Oracle错误代码SQLCODE描述
ACCESS_INTO_NULL06530-6530当一个空对象被自动分配一个值时会引发它。
CASE_NOT_FOUND06592-6592当没有选择CASE语句的WHEN子句中的任何选项时,会引发这个错误,并且没有ELSE子句。
COLLECTION_IS_NULL06531-6531当程序尝试将EXISTS以外的集合方法应用于未初始化的嵌套表或varray时,或程序尝试将值分配给未初始化的嵌套表或varray的元素时,会引发此问题。
DUP_VAL_ON_INDEX00001-1当尝试将重复值存储在具有唯一索引的列中时引发此错误。
INVALID_CURSOR01001-1001当尝试进行不允许的游标操作(例如关闭未打开的游标)时会引发此错误。
INVALID_NUMBER01722-1722当字符串转换为数字时失败,因为字符串不代表有效的数字。
LOGIN_DENIED01017-1017当程序尝试使用无效的用户名或密码登录到数据库时引发。
NO_DATA_FOUND01403+100SELECT INTO语句不返回任何行时会引发它。
NOT_LOGGED_ON01012-1012当数据库调用没有连接到数据库时引发。
PROGRAM_ERROR06501-6501当PL/SQL遇到内部问题时会引发。
ROWTYPE_MISMATCH06504-6504当游标在具有不兼容数据类型的变量中获取值时引发。
SELF_IS_NULL30625-30625当调用成员方法时引发,但对象类型的实例未初始化。
STORAGE_ERROR06500-6500当PL/SQL用尽内存或内存已损坏时引发。
TOO_MANY_ROWS01422-1422SELECT INTO语句返回多行时引发。
VALUE_ERROR06502-6502当发生算术,转换,截断或者sizeconstraint错误时引发。
ZERO_DIVIDE014761476当尝试将数字除以零时引发。
exception
when no_data_found then dbms_output.put_line('暂无此数据哦!');
when to_many_rows then dbms_output.put_line('返回多行数据,请使用游标');
when others then dbms_output.put_line('其他异常');

非预定义异常

第一步,定义异常:<异常情况> EXCEPTION
第二步,将定义的异常和实际错误代码关联起来:PRAGMA EXCEPTION(<异常情况>,<错误代码>)
第三不,和预定义错误一样,捕获异常 when <异常情况> then 异常处理;

自定义异常

基本格式:
1.定义异常:<异常情况> EXCEPTION
2.触发异常:一般通过我们的语句判断觉得需要抛出异常就使用EAISE <异常情况>;
3.捕获异常:when <异常情况> then 处理;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值