异常使用的实例
查询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;