-- 存储过程 PROCEDURE 和 自定义函数 FUNCTION
功能:
PROCEDURE 用来更新/同步数据 。
FUNCTION 用来 对复杂的计算进行封装 ;
/* 他们俩共同的特点就是对一些 公共的逻辑或者代码进行 封装,方便后续的更新和调用 。 面向对象 。*/
语法:
-- 创建存储过程
CREATE OR REPLACE PROCEDURE SP_过程名(参数1 [IN|OUT|IN OUT] 数据类型,参数2 [IN|OUT|IN OUT] 数据类型……)
IS /*|AS*/
BEGIN
过程的执行体 ;
END ;
-- 创建自定义函数
CREATE OR REPLACE FUNCTION FUN_函数名(参数1 [IN|OUT|IN OUT] 数据类型,参数2 [IN|OUT|IN OUT] 数据类型……)
RETURN 返回的数据类型
IS /*|AS*/
BEGIN
函数的执行体 ;
RETURN 返回的计算结果 ; --里面必须要有一个RETURN子句
END ;
-------------------------------------------------------------------
-- 通过 SP 实现打印 HELLO WORLD
CREATE OR REPLACE PROCEDURE SP_HELLO_X
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('HELLO WORLD');
END ;
-- 调用存储过程
BEGIN
SP_HELLO_X ;
END ;
----------------- 在存储过程中加入 参数实现打印想要打印的结果
CREATE OR REPLACE PROCEDURE SP_HELLO_X1(P_STR VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(P_STR);
END ;
-- 调用存储过程
BEGIN
SP_HELLO_X('HELLO WORLD') ;
END ;
------------------- 自定义函数 主要用于计算
-- 创建一个自定义函数 比较2个参数的大小 返回较大的结果
CREATE OR REPLACE FUNCTION FUN_BIGGER(P_1 NUMBER ,P_2 NUMBER )
RETURN NUMBER
IS
BEGIN
IF NVL(P_1,0)>= NVL(P_2,0) THEN
RETURN NVL(P_1,0);
ELSE
RETURN NVL(P_2,0);
END IF ;
END ;
SELECT FUN_BIGGER(2,5) , FUN_BIGGER(500,200)
FROM DUAL ;
SELECT E.SAL ,E.COMM , FUN_BIGGER(E.SAL,E.COMM)
FROM EMP E
-- 创建一个 自定义函数 接受员工的 入职时间 返回员工的社保缴纳日期 以字符形式 显示为 YYYY-MM
CREATE OR REPLACE FUNCTION FUN_JN(P_DATE DATE )
RETURN VARCHAR2
IS
BEGIN
RETURN TO_CHAR(ROUND(P_DATE,'MM') ,'YYYY-MM') ;
END ;
SELECT E.* , FUN_JN(E.HIREDATE)
FROM EMP E ;
------------------------------------------------------------------------
通过SP封装造数据的脚本
CREATE OR REPLACE PROCEDURE SP_ZS(P_NUM NUMBER)
IS
/*V_TIMES NUMBER(10) :=&请输入你要造的数据量 ;*/
V_SNO NUMBER(6) ;
V_GENDER VARCHAR2(3);
V_NAME VARCHAR2(12);
V_PHONE_NO NUMBER(11);
BEGIN
FOR X IN 1 .. P_NUM LOOP -- 循环次数, 每次插入数据的数量
V_SNO := SEQ_1.NEXTVAL ; --通过序列 获得 不会重复的 学生编号
V_GENDER := CASE
WHEN MOD(V_SNO, 3) = 0 THEN
'男'
ELSE
'女'
END;
V_NAME := CASE
WHEN MOD(V_SNO, 3) = 1 THEN
'张' || V_SNO
WHEN MOD(V_SNO, 3) = 2 THEN
'王' || V_SNO
ELSE
'李' || V_SNO
END;
V_PHONE_NO := TRUNC(DBMS_RANDOM.VALUE('13000000000', '18900000000'));
INSERT INTO STU_0118
(SNO, SNAME, GENDER, PHONE_NO)
VALUES
(V_SNO, V_NAME, V_GENDER, V_PHONE_NO);
END LOOP;
COMMIT;
END;
-- 调用
BEGIN
SP_ZS(5000);
END ;
-- 验证
SELECT S.*,
COUNT(*) OVER() CT,
MIN(S.SNO) OVER() MIN_SNO,
MAX(S.SNO) OVER() MAX_SNO
FROM STU_0118 S ;
存储过程和函数
最新推荐文章于 2025-01-21 10:24:24 发布
本文深入探讨了数据库中的存储过程PROCEDURE和自定义函数FUNCTION,讲解了它们的功能和使用场景。存储过程用于更新/同步数据,而函数则用于封装复杂计算。通过示例展示了如何创建和调用存储过程及函数,如打印指定文本、比较数值大小以及计算社保缴纳日期等。同时,还提供了一个存储过程封装的造数据脚本,用于批量插入学生信息,并进行了数据验证。
1963

被折叠的 条评论
为什么被折叠?



