[存储过程、函数应用]

本文详细介绍了SQL中的存储过程和函数的创建与应用,包括读取员工信息、修改工资、计算工作年限等操作,以及如何在不同场景下使用存储过程和函数来处理数据库数据。此外,还涵盖了参数输入、输出和类型转换的实例,展示了SQL在数据库管理中的强大功能。
摘要由CSDN通过智能技术生成

--1.创建一个存储过程,以员工号为参数,输出该员工的工资 
CREATE OR REPLACE PROCEDURE P1(V_EMPNO IN NUMBER, V_EMP OUT EMP%ROWTYPE)
 IS
BEGIN
  SELECT * INTO V_EMP FROM EMP WHERE EMPNO = V_EMPNO;
END;

DECLARE 
V_E EMP%ROWTYPE; 
V_N NUMBER := &INPUT;
BEGIN
  P1(V_N, V_E); 
   DBMS_OUTPUT.PUT_LINE(V_E.SAL);
END;

CREATE OR REPLACE PROCEDURE P7(v_empno IN emp.empno%TYPE)
IS
v_sal NUMBER;
BEGIN
  SELECT sal INTO v_sal FROM emp WHERE empno=v_empno;
  dbms_OUTPUT.PUT_LINE(v_empno||v_sal); 
  END;
  CALL p7(7369);
--2.创建一个存储过程,以员工号为参数,修改该员工的工资。若该员工属于10号部门,  
则工资增加150;若属于20号部门,则工资增加200;若属于30号部门,则工资增加250;  
若属于其他部门,则增加300。
/*
CREATE OR REPLACE PROCEDURE p2(v_empno empp.empno%TYPE)
IS
v_sal empp.sal%TYPE;
v_deptno empp.deptno%TYPE;
BEGIN
  SELECT sal,deptno INTO v_sal,v_deptno FROM empp WHERE empno=v_empno;
  IF v_deptno=10 THEN
    v_sal:=v_sal+150;
    ELSIF v_deptno=20 THEN
      v_sal:=v_sal+200;
      ELSIF v_deptno=30 THEN
        v_sal:=v_sal+250;
        ELSE
          v_sal:=v_sal+300;
          END IF;
          UPDATE empp  SET sal=v_sal WHERE  empno=v_empno; 
END;
SELECT * FROM empp;
SELECT * FROM emp;
DECLARE 
v_empno empp.empno%TYPE:=&input;
BEGIN 
 p2(v_empno);
 dbms_OUTPUT.PUT_LINE('----------'); 
END;
*/ 

CREATE OR REPLACE PROCEDURE p3(v_empno IN empp.empno%TYPE)
IS
v_deptno empp.deptno%TYPE;
BEGIN
  SELECT deptno INTO v_deptno FROM empp WHERE empno=v_empno;
  IF v_deptno=10 THEN
    UPDATE empp  SET sal =sal+150 WHERE deptno=v_deptno;
    END IF;
END;

DECLARE 
v_n empp.empno%TYPE:=&input;
BEGIN 
 p3(v_n);
END;  

--3.创建一个存储过程,以员工号为参数,返回该员工的工作年限(以参数形式返回)。
CREATE OR REPLACE PROCEDURE P4(V_EMPNO IN EMPP.EMPNO%TYPE, V_YEAR  OUT NUMBER) 
IS
BEGIN
  SELECT ROUND((SYSDATE - HIREDATE) / 365, 1) INTO V_YEAR FROM EMPP WHERE EMPNO = V_EMPNO;
END;

DECLARE
  V_EMPNO EMPP.EMPNO%TYPE :=&INPUT;
  V_YEAR  NUMBER;
BEGIN
  P4(V_EMPNO, V_YEAR);
  DBMS_OUTPUT.PUT_LINE(V_EMPNO || ' 工作年限为 ' || V_YEAR || '年');
END;
--4.创建一个存储过程,以部门号为参数,输出入职日期最早的10个员工信息。
/*SELECT e.*,dense_rank()OVER(ORDER BY hiredate) r FROM empp e ) a WHERE a.r<11;

CREATE OR REPLACE PROCEDURE p5
IS
BEGIN
  FOR i IN (SELECT * FROM (SELECT e.*,dense_rank()OVER(ORDER BY hiredate) r FROM empp e ) a WHERE a.r<11) 
    LOOP
    dbms_OUTPUT.PUT_LINE(i.empno||';'||i.ename||';'||
    i.job||';'||i.mgr||';'||i.hiredate||';'||i.sal||';'||
    i.comm||';'||i.deptno); 
  END LOOP;
END;

BEGIN
  p5();
  END;*/ --wucan
  
CREATE OR REPLACE PROCEDURE PP(V_DEPTNO EMPP.DEPTNO%TYPE)
IS
CURSOR CUR IS SELECT * FROM EMPP WHERE DEPTNO=V_DEPTNO ORDER BY HIREDATE;
V_DATA NUMBER:=0;
BEGIN
  FOR I IN CUR LOOP
    V_DATA:=V_DATA+1;
    DBMS_OUTPUT.PUT_LINE(I.EMPNO||';'||I.ENAME||';'||TO_CHAR(I.HIREDATE,'yyyy-MM-dd')); 
    IF V_DATA=10 THEN
      EXIT;
     EN

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.房东的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值