异常使用的实例
查询student表里面的ID 为1 的那条记录,给其设置权限,不让其显示信息
DECLARE IDS NUMBER; B STUDENT%ROWTYPE; EXC EXCEPTION; --定义一个异常 BEGIN /* 如果有一个变量b ,可以SELECT S.NAME INTO B FROM STUDENT S WHERE S.ID = 3; 把其name 赋值给b*/ /* 终止本次循环,继续下次循环 continue; 打断循环 exit; 终止当前执行的整个程序 return ;*/ IDS := 1; IF IDS = 1 THEN RAISE EXC; --抛出异常 END IF; SELECT * INTO B FROM STUDENT ST WHERE ST.ID = IDS; DBMS_OUTPUT.PUT_LINE(B.NAME || ',' || B.SEX || ',' || TO_CHAR(B.BIRTHDAY, 'yyyy')); EXCEPTION WHEN EXC THEN DBMS_OUTPUT.PUT_LINE('权限不够'); END;
函数 (有返回值)
CREATE OR REPLACE FUNCTION MYTEST(A IN INTEGER, B OUT INTEGER) RETURN INTEGER AS BEGIN IF A < 0 THEN B := A; RETURN B; END IF; RETURN A; /* 输入型参数--in, 用于程序体里参与计算的逻辑 b 没有参与运算,只是赋了值 输出型参数--out, 用于返回多个值 ,同一个值包含着不同的类型*/ END;
调用
DECLARE A INTEGER := 2; B INTEGER; C INTEGER; BEGIN c:= mytest(a,b); dbms_output.put_line(c); dbms_output.put_line(b);
存储过程(没有返回值)
CREATE OR REPLACE PROCEDURE MYTEST2(A IN INTEGER DEFAULT 0, B OUT INTEGER) AS BEGIN --输入型可以给一个默认值 B := A + 5; IF A > 1 THEN B := A; END IF; END;
调用
DECLARE A INTEGER := 2; B INTEGER; BEGIN mytest2(a,b); dbms_output.put_line(b); END;
问: 什么时候用函数,什么时候用存储过程?
一个程序块当有一个返回值的时候用函数
如果有多个返回值的时候用存储过程(输出型参数) ,其实就是把一个功能封装起来,随时调用
------谁调用谁提交
存储过程的一个实例运用
在student表里面,把Mark为0 的记录删除,为1的记录价格加5 ,建立一个没有参数的存储方式,
CREATE OR REPLACE PROCEDURE jia AS --存储方式 CURSOR PRC IS --用到了游标 SELECT * FROM PRODUCT P; BEGIN FOR PP IN PRC LOOP IF PP.MARK = 0 THEN DELETE product p WHERE p.mark = pp.mark; ELSIF PP.MARK = 1 THEN UPDATE product p SET p.outprice = p.outprice + 5.00 WHERE p.mark = pp.mark; END IF; END LOOP; END;
--test window DECLARE BEGIN jia; --直接调用 commit; END;