ORcale 存储过程实例

1、建立一个存储过程用来接收一个员工号,返回他的工资和他所在部门的平均工资并作为传出参数传出。
CREATE OR REPLACE PROCEDURE p_get_emp
(i_empno emp.empno%TYPE,o_sal OUT emp.sal%TYPE,o_avg_a OUT emp.sal%TYPE)
AS
BEGIN
        SELECT sal
          INTO  o_sal
          FROM emp
          WHERE empno=i_empno;
        dbms_output.put_line(o_sal); 
 SELECT AVG(sal) AS aa
 INTO o_avg_a
 FROM emp WHERE deptno =(SELECT deptno FROM emp WHERE empno=i_empno);
         dbms_output.put_line(o_avg_a); 
END p_get_emp;


DECLARE
      i_no emp.empno%TYPE;
      v_sal emp.sal%TYPE;
      avg_sal emp.sal%TYPE;
   BEGIN
        i_no:=&请输入;
        p_get_emp(i_no,v_sal,avg_sal);
        dbms_output.put_line(to_char(i_no) || v_sal || avg_sal);
   END;

 

2、建立一个存储过程用来接收一个部门号,找出其中的两位最老的员工的员工号,并打印。
CREATE OR REPLACE PROCEDURE proc_deptno(i_deptno emp.deptno%TYPE)
IS
       CURSOR emp_cur
       IS
       SELECT empno,hiredate
       FROM emp
       WHERE deptno=i_deptno
       AND ROWNUM<=2 ORDER BY hiredate;
       o_emp_col emp_cur%ROWTYPE;
BEGIN
       OPEN emp_cur;
       FETCH emp_cur INTO o_emp_col;
       WHILE emp_cur%FOUND
       LOOP
       dbms_output.put_line(o_emp_col.empno ||' '||o_emp_col.hiredate);
       FETCH emp_cur INTO o_emp_col;
       END LOOP;
       CLOSE emp_cur;
END proc_deptno;


DECLARE
        i_empno emp.empno%TYPE;
        i_no emp.deptno%TYPE;
  BEGIN
       i_no:=&请输入;
        proc_deptno(i_no);
    END;

3、编写一个过程用来传入一个员工号,在emp表中删除一个员工,当该员工是该部门的最后一个员工时
就在dept表中删除该员工所在的部门。
CREATE OR REPLACE PROCEDURE p_del_empno(i_empno emp.empno%TYPE)
IS
    i NUMBER(2,0);
    o_deptno emp.deptno%TYPE;
BEGIN
        SELECT deptno
          INTO o_deptno
          FROM emp
          WHERE empno=i_empno;
         
        SELECT COUNT(deptno)
          INTO i
          FROM emp WHERE deptno=o_deptno;
         
        DELETE
          FROM emp
         WHERE empno=i_empno;
            
          IF i<=1 THEN
        DELETE FROM dept
        WHERE deptno=o_deptno;
       END IF;
END;


DECLARE
        i_empno emp.empno%TYPE;
        i_no emp.empno%TYPE;
  BEGIN
       i_no:=&请输入;
        p_del_empno(i_no);
        dbms_output.put_line(i_no);
   END; 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
帮助那些想尽快学习存储过程 实例:create PROCEDURE pagination @tblName varchar(255), -- 表名 @strGetFields varchar(1000) = '*', -- 需要返回的列 @fldName varchar(255)='', -- 排序的字段名 @PageSize int = 10, -- 页尺寸 @PageIndex int = 1, -- 页码 @pagecount int output, -- 返回页总数, 非 0 值则返回 --@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序 @strWhere varchar(1500) = '1=1' -- 查询条件 (注意: 不要加 where) AS declare @sql nvarchar(2000) --获得表中所有记录的条数 declare @recordcount int declare @getcountsql nvarchar(2000) set @getcountsql = N'select @count = count(*) from ' + @tblName + N' where ' + @strWhere exec sp_executesql @getcountsql,N'@count int output',@count=@recordcount output if @recordcount=0 begin set @pagecount = 0 return end declare @lastcount int set @lastcount = @recordcount % @PageSize if @lastcount = 0 set @pagecount = @recordcount / @PageSize else set @pagecount = @recordcount / @PageSize + 1 if @lastcount = 0 or @pageindex < @pagecount begin set @sql = N'select ' + @strGetFields + N' from (select top ' + convert(nvarchar(4),@PageSize) + N' * from (select top ' + convert(varchar(10),@PageSize*@PageIndex) + N' * from ' + @tblName + N' where ' + @strWhere + N' order by ' +@fldName+ N') as t order by ' + @fldName + ' desc) as tt order by ' + @fldName end else begin if @lastcount != 0 and @pageindex = @pagecount begin set @sql = N'select ' + @strGetFields + N' from (select top ' + convert(nvarchar(4),@lastcount) + N' * from (select top ' + convert(varchar(10),@PageSize*@PageIndex) + N' * from ' + @tblName + N' where ' + @strWhere + N' order by ' +@fldName+ N') as t order by ' + @fldName + ' desc) as tt order by ' + @fldName end end print @sql exec sp_executesql @sql go select * from authors declare @pagecount int exec pagination 'authors','*','au_id',5,1, @pagecount output,'state=''CA''' print @pagecount

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值