块结构
声明部分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_NULL | 06530 | -6530 | 当一个空对象被自动分配一个值时会引发它。 |
CASE_NOT_FOUND | 06592 | -6592 | 当没有选择CASE 语句的WHEN 子句中的任何选项时,会引发这个错误,并且没有ELSE 子句。 |
COLLECTION_IS_NULL | 06531 | -6531 | 当程序尝试将EXISTS 以外的集合方法应用于未初始化的嵌套表或varray 时,或程序尝试将值分配给未初始化的嵌套表或varray 的元素时,会引发此问题。 |
DUP_VAL_ON_INDEX | 00001 | -1 | 当尝试将重复值存储在具有唯一索引的列中时引发此错误。 |
INVALID_CURSOR | 01001 | -1001 | 当尝试进行不允许的游标操作(例如关闭未打开的游标)时会引发此错误。 |
INVALID_NUMBER | 01722 | -1722 | 当字符串转换为数字时失败,因为字符串不代表有效的数字。 |
LOGIN_DENIED | 01017 | -1017 | 当程序尝试使用无效的用户名或密码登录到数据库时引发。 |
NO_DATA_FOUND | 01403 | +100 | 当SELECT INTO 语句不返回任何行时会引发它。 |
NOT_LOGGED_ON | 01012 | -1012 | 当数据库调用没有连接到数据库时引发。 |
PROGRAM_ERROR | 06501 | -6501 | 当PL/SQL遇到内部问题时会引发。 |
ROWTYPE_MISMATCH | 06504 | -6504 | 当游标在具有不兼容数据类型的变量中获取值时引发。 |
SELF_IS_NULL | 30625 | -30625 | 当调用成员方法时引发,但对象类型的实例未初始化。 |
STORAGE_ERROR | 06500 | -6500 | 当PL/SQL用尽内存或内存已损坏时引发。 |
TOO_MANY_ROWS | 01422 | -1422 | 当SELECT INTO 语句返回多行时引发。 |
VALUE_ERROR | 06502 | -6502 | 当发生算术,转换,截断或者sizeconstraint 错误时引发。 |
ZERO_DIVIDE | 01476 | 1476 | 当尝试将数字除以零时引发。 |
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 处理;