存储过程学习笔记

--根据存储过程的参数不同,将存储过程分为四大类
--(1)不带参数的存储过程
--(2)带输入参数的存储过程(in)
--(3)带输出参数的存储过程(out)
--(4)带输入输出参数的存储过程


--(1)不带参数的存储过程

打印九九乘法表

create or replace procedure proc_jiujiu
as
begin
    --外层循环控制行
    for x in 1..9
    loop
        --内层循环控制每行显示多少个表达式
        for y in 1..x
        loop
            dbms_output.put(x || '*' || y || '='||x*y || ' ');
        end loop;  
        dbms_output.new_line;
    end loop;
end;

--执行

execute proc_jiujiu;--只能在命令窗口中执行

--在SQL窗口中
begin
   proc_jiujiu;  
end;


--带输入参数的存储过程(in),默认的参数就是输出参数

--通过员工编号,查询员工姓名,打印出来 
create or replace procedure proc_emp(eno number) --特别要注意,参数类型不能指定长度
as
   --变量
   empname emp.ename%type;     --员工姓名
begin
   select ename into empname from emp where empno=eno;
   dbms_output.put_line(empname);
end;

--执行
begin
   proc_emp(7499);
end;


--带输出参数的存储过程 out 表示是一个输出参数
create or replace procedure proc_emp(eno number,empname out varchar2) --特别要注意,参数类型不能指定长度
as
begin
   select ename into empname from emp where empno=eno;
end;


--执行带输出参数的存储过程
declare
   empname emp.ename%type;
begin
   proc_emp(7566,empname);
   dbms_output.put_line(empname);
end;


create or replace procedure proc_add(a number,b number,c out number) 


as
begin
      c:=a+b; 
      -- select a+b into c from dual;
end proc_add; 


--执行带输出参数的存储过程
declare
    aa number;
    bb number;
    cc number;
begin
    aa:='&aa';
    bb:='&bb';
    proc_add(aa,bb,cc);
    dbms_output.put_line(cc);
end;      


--带输入输出参数的存储过程  in out
int add(int a,int b){
    b = a+b;
    return b;
}   


create or replace procedure proc_add(a number,b in out number)
as
begin
       b := a+b;
end;


--执行带输入输出参数的存储过程
declare
      bb number;
begin
      bb:='&bb';
      proc_add(2,bb);
      dbms_output.put_line(bb);
end;


--通过员工编号查询此员工的工资
create or replace procedure proc_emp(num in out number)
as
begin
       select sal into num from emp where empno=num;
end;


--执行
declare
       num number;
begin
       num:='&empno';
       proc_emp(num);
       dbms_output.put_line('员工工资'||num);
end;


--逐条逐条的显示每个员工的信息(姓名,工资),
--统计工资大于3000的人数以及工资低于1000的人数
--分析(排位)函数:
rank() 相同的值排位相同,序号跳跃
row_number() 相同的值排位不同,序号连续
dense_rank() 相同的值排位相同,序号连续


select ename,sal,row_number() over (order by sal desc) as rankNum FROM EMP e;




declare
       num1 number(10) default 0; -- 工资大于3000的人数
       num2 number(10) default 0; -- 工资低于1000的人数
       num3 number(10) default 0; -- 保存表中的总记录数
       empname emp.ename%type;--员工姓名
       empsal emp.sal%type;--员工的工资
begin 
       --查询总记录数
       select count(*) into num3 from emp;
       for x in 1..num3
       loop
           select ename,sal into empname,empsal 
           from (
                select ename,sal,row_number() over (order by sal desc) as rankNum FROM EMP e
           ) t
           where t.rankNum = x;
           dbms_output.put_line('员工姓名:'|| empname||',员工薪水:'||empsal);--打印员工姓名和工资
           --统计工资大于3000的人数
           if empsal >= 3000 then
              num1 :=num1+1;
           end if;
            --统计工资小于1000的人数
           if empsal <= 1000 then
              num2 :=num2+1;
           end if;
       end loop;
       dbms_output.put_line('工资大于3000的人数为:'|| num1);
       dbms_output.put_line('工资小于1000的人数为:'|| num2);
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值