存储过程:

是指在一些大型数据库系统中.一组为了完成特定功能的SQL语句集,存放在数据库之中,一次编译,永久有效

这是SQL语句是从0-50,每次增2,代码如下:

--这是SQL语句是从0-50,每次增2
--/ 
CREATE OR REPLACE PROCEDURE x1
IS 
i INT :=0;
BEGIN 
LOOP
dbms_output.put_line(i);
i :=i+2;
EXIT WHEN i>50;
END LOOP;
END;
/
CALL x1();

附图如下:
在这里插入图片描述

根据x2(值)中的值删除该表中的deptno为50的行,代码如下:

-- 根据x2(值)中的值删除该表中的deptno为50的行   
--/
CREATE OR REPLACE PROCEDURE x2(i INT)
IS
NAME VARCHAR2(20);
BEGIN 
DELETE FROM SCOTT.DEPT WHERE DEPTNO=i;
END;
/         
CALL x2(50);

附图如下:
在这里插入图片描述
在这里插入图片描述

根据deptno来查找相应的名字,代码如下:

--    根据deptno来查找相应的名字    
--/
CREATE OR REPLACE PROCEDURE x3(i INT)    
IS 
NAME VARCHAR2(20);
BEGIN
SELECT dname INTO NAME FROM DEPT WHERE deptno=i;
dbms_output.put_line(NAME);
END;
/       
CALL x3(20);

在这里插入图片描述

存储函数 :

我们查询的时候使用的AVG,SUM,COUNT等都算是存储函数,是一种方便我们对数据类型统计或操作的函数
(nvl :看comm 是否有值,如果是null,就变成0)

计算工资和奖金总和,代码如下:

--a,b分别对应了sal,comm.
--/
CREATE OR REPLACE FUNCTION mySUM(a NUMBER,b NUMBER) RETURN NUMBER
IS
i NUMBER :=0;
BEGIN
i :=nvl(a,0)+nvl(b,0);
RETURN i;
END;
/
SELECT mySUM(sal,comm) FROM EMP;

附图如下:
在这里插入图片描述
根据传过来的DEPTNO的值来找到相应的部门编号,名称,以及位置,代码如下:

-- plsql 创建复合函数类型      
--/
CREATE OR REPLACE PROCEDURE x4(s NUMBER)
IS
TYPE DINFO IS RECORD(
deptno NUMBER,
dname VARCHAR2(20),
loc VARCHAR2(20)
);
d DINFO;
BEGIN
SELECT deptno,dname,loc INTO d.deptno,d.dname,d.loc FROM DEPT WHERE deptno=s;
dbms_output.put_line('部门编号'||d.deptno||'部门名称'||d.dname||'部门位置'||d.loc);
END;
/
CALL x4(10)

附图如下:
在这里插入图片描述
游标
是一个SQL内存的一个工作区,由系统或者用户以变量的形式定义,并使用游标主要分为两种
(一).显式游标
数据库中的DML操作,以及单行的DQL操作,会自动创建显式游标

 			SQL%ROWCOUNT     可以获得到SQL影响到的数据行数
            SQL%FOUND        用来判断SQL有没有影响,如果有返回true,如果没有返回false
            SQL%NOTFOUND     用来判断SQL有没有影响,如果有返回false,如果没有返回true

根据传进去的值来与EMPNO进行对比,然后删除比传入的s的值大的数据,然后使用"SQL%ROWCOUNT" 来计算影响到的函数 ,代码如下:

--/ 
CREATE OR REPLACE PROCEDURE x5(s NUMBER)
IS        
BEGIN
DELETE FROM EMP WHERE EMPNO>s;
IF SQL%FOUND THEN
dbms_output.put_line('成功删除掉员工'|| SQL%ROWCOUNT||'个');
ELSE
dbms_output.put_line('没有删除掉员工'||SQL%ROWCOUNT||'个');
END IF;
END;
/
INSERT INTO EMP(EMPNO) VALUES(8908);
CALL x5(8887);        

附图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(二).隐式游标
需要用户手动创建,专门针对SELECT语句
查出员工的名字,代码如下:

--/        
DECLARE
CURSOR YB IS SELECT * FROM EMP;                         --给SELECT * FROM EMP 创建一个隐式游标
E EMP%ROWTYPE;                                           --从游标中提取表结构,然后创建了一个跟表结构一样的对象
BEGIN
OPEN YB;                                                  --开启隐式游标
FETCH YB INTO E;                                         --把游标中的查询出来的结果赋值给E
WHILE YB%FOUND LOOP
dbms_output.put_line('员工名字叫:'||E.ENAME);
FETCH YB INTO E;                                         --再一次将游标内的赋值给E
END LOOP;                                                --关闭loop
CLOSE YB;                                                 --关闭隐式游标(不关闭会一直占用内存)
END;
/

附图如下:
在这里插入图片描述

two_many_rows 查到了多条记录
no_data_found 找不到记录
OTHERS 其他所有异常,需要组合其他异常使用

--根据传入的部门编号进行查询,(这是手写的异常)      
--/
CREATE OR REPLACE PROCEDURE x6(i NUMBER)
IS
n VARCHAR(20);
BEGIN 
SELECT ename INTO n FROM EMP WHERE deptno=i;
EXCEPTION
WHEN too_many_rows THEN
dbms_output.put_line('查到了不止一条记录,请修改SQL或者参数');    
WHEN no_data_found THEN
dbms_output.put_line('找不到记录');
WHEN OTHERS THEN
dbms_output.put_line('出现了很奇妙的异常');
END;
/
CALL x6(20);

附图如下:
在这里插入图片描述

触发器

行级触发器(你的SQL影响了多少行,触发器就执行了多少次)
   
语句触发器(你的SQL无论影响了多少次,触发器就只执行一次)

行级触发器,实例代码如下:
在这里插入图片描述
语句触发器,实例代码如下:

--语句触发器
CREATE TABLE M(
ID INT
)
INSERT INTO M VALUES(S1.nextval);
SELECT * FROM M

--/
CREATE OR REPLACE TRIGGER MM
AFTER DELETE ON M
BEGIN
dbms_output.put_line('梁进峰摸电线,又触电了');
END;
/
DELETE FROM M WHERE M.ID>6 

附图如下:
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐