第一章、存储过程
1.1、概念
存储过程是一个命名的程序块,包括过程的名称、过程使用的参数,以及过程执行的操作。
(类似于java中的一种函数,但是存在区别)
可以指定输入参数,和输出参数。
1.2、创建存储过程
CREATE OR REPLACE PROCEDURE SP_MYEMP(PI_DEPTNO IN NUMBER,
PO_HIREDATE OUT DATE,
PIO_JOB_ENAME IN OUT VARCHAR) AS
V_SAL NUMBER;
BEGIN
SELECT E.NAME, E.SAL, E.HIREDATE
INTO PIO_JOB_ENAME,V_SAL, PO_HIREDATE
FROM EMP E
WHERE E.DEPTNO = PI_DEPTNO
AND E.JOB = PIO_JOB_ENAME;
DBMS_OUTPUT.PUT_LINE(PIO_JOB_ENAME || ' ' || V_SAL || ' ' || PO_HIREDATE);
END;
这个是一个存储过程创建的例子,这个存储过程有三个参数,第一个是入参,第二个出参,第三个即是入参也是出参。
1.3、存储过程的调用
存储过程的调用方式:
- 用execut命令调用
- PL/SQL程序块内部调用
DECLARE V_JOB_NAME VARCHAR2(100) := 'code'; V_HIREDATE DATE; BEGIN SP_MYEMP(10, V_HIREDATE, V_JOB_NAME); END;
1.4.存储过程的删除
DROP PROCEDURE 过程名;
第二章、函数
2.1、概述
函数式讲一段已经编译好的代码片段封装在数据库中,用于返回特定的数据,在函数头部必须包含return子句,在函数体内必须包含return返回数据。
作用:
- 提高执行效率
- 提高代码复用性
- 同时函数包含系统函数和自定义函数
2.2、自定义函数的创建
--创建无参函数,返回当前时间
CREATE OR REPLACE FUNCTION CUR_DATETIME RETURN VARCHAR2 IS
BEGIN
RETURN TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS');
END;
CREATE OR REPLACE FUNCTION GET_SAL(NAME VARCHAR2) RETURN NUMBER AS
V_SAL EMP.SAL%TYPE;
BEGIN
SELECT SAL INTO V_SAL FROM EMP WHERE UPPER(ENAME) = UPPER(NAME);
RETURN V_SAL;
END;
/
SELECT get_sal('SMITH') FROM dual;
2.3、存储过程与函数的区别
- 返回值区别:函数又一个返回值,而存储过程是通过参数返回的,可以有零个或者多个。
- 调用区别:函数可以在查询语句中直接调用,而存储过程必须单独调用
- 作用:函数一般用于计算并返回一个计算机结果,而存储过程一般用于完成特定的操作。
第三章、触发器
3.1、概念
触发器是一个与表相关的。存储的PL/SQL程序,当一个特定的数据操作语句,在指定的表上操作,那么oracle会自动执行触发器中定义的语句,触发器由触发事件,触发条件,触发操作散步分构成。
行级触发器:一条sql语句,影响了多少行记录,就会执行多少次触发器。
语句级触发器,一条sql语句,无论影响了多少行记录都只触发一次;
3.2、创建触发器
整个触发器表明在这个表插入一条数据之后执行里面的代码块,这里没有执行是否为行级触发器,默认为语句及触发器。
注意:在触发器使用的过程中避免对同一个表设置多个触发器,且另外的触发器产生问题。
--语句级触发器
CREATE OR REPLACE TRIGGER TRI_INSERT
AFTER INSERT ON EMP
DECLARE
BEGIN
DBMS_OUTPUT.PUT_LINE('有数据插入了');
END;
--行级触发器
CREATE OR REPLACE TRIGGER TRI_TEST4
BEFORE UPDATE ON EMP
FOR EACH ROW
DECLARE
BEGIN
DBMS_OUTPUT.PUT_LINE('修改的薪资前后为:' || :OLD.SAL || '新的为' || :NEW.SAL);
END;
第四章、包
4.1、概念
包就是在逻辑上把相关的存储过程、函数、变量、常量和游标等PL/SQL程序组合在一起,并赋予一定的管理功能的程序块。
包的组成:
包定义(包头):声明包内的数据类型、变量、常量、游标、子程序和函数等元素
包体:定义了包定义部分的具体实现
4.2、创建包头、包体
创建一个包,其中包含包头和包体两个部分,这个包中包含一个存储过程和自定义函数。在包头中需要声明两个东西。然后在包体中需要具体到每个业务实现过程。
CREATE OR REPLACE PACKAGE MYPACKAGE IS
A NUMBER;
PROCEDURE MY_SP(P_A IN NUMBER);
FUNCTION MY_FUN(A_A NUMBER) RETURN NUMBER;
END;
CREATE OR REPLACE PACKAGE BODY MYPACKAGE IS
PROCEDURE MY_SP(P_A IN NUMBER) IS
BEGIN
--过程
END MY_SP;
FUNCTION MY_FUN(F_A NUMBER) RETURN NUMBER IS
BEGIN
--函数体
END MY_FUN;
END MYPACKAGE;