存储过程和函数

本文深入探讨了数据库中的存储过程PROCEDURE和自定义函数FUNCTION,讲解了它们的功能和使用场景。存储过程用于更新/同步数据,而函数则用于封装复杂计算。通过示例展示了如何创建和调用存储过程及函数,如打印指定文本、比较数值大小以及计算社保缴纳日期等。同时,还提供了一个存储过程封装的造数据脚本,用于批量插入学生信息,并进行了数据验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- 存储过程 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 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值