oracle存储过程+PL/SQL体学习笔记

PL/SQL体

变量赋值

赋值方式有两种:

  • 直接赋值

    v_name varchar2(20) := 'zhagnsan';
    
  • 语句赋值

    select '昆明市' into v_addree from dual;
    
-- Created on 2020/12/30 by ADMINISTRATOR 
declare
  --声明部分
  -- 姓名
  v_name varchar2(20) := 'zhagnsan';
  --薪水
  v_sal number;
  --地址
  v_addree varchar2(200);

begin
  -- 直接赋值
  v_sal := 2000;

  --语句赋值
  select '昆明市' into v_addree from dual;
  --  '姓名:'||v_name 拼接字符串
  dbms_output.put_line('姓名:'||v_name ||',薪水:'||v_sal||',地址:'||v_addree);
end;

引用型变量

变量的类型和长度取决于 表中列的类型和长度

语法: 变量名称 表名.列名%TYPE

-- Created on 2020/12/30 by ADMINISTRATOR 
declare
  --声明部分
  -- 姓名    ac01表中的aac003字段是什么类型和长度,v_name就是什么类型和长度
  v_name ac01.aac003%type;
  --单位id
  v_sal ac01.sab004%type;

begin
  select AAC003, SAB004
    into v_name, v_sal
    from ac01
   where AAE005 = '12322';

  --  '姓名:'||v_name 拼接字符串
  dbms_output.put_line('姓名:' || v_name || ',单位id:' || v_sal);
end;

记录型变量

接收表中的一整行记录,相当于Java中的一个对象

语法: 变量名称 表名%ROWTYPE

-- 查询ac01中AAE005 = '12322'的用户的姓名和单位id
declare 
  -- 记录型变量
  v_emp ac01%rowtype;
begin
  select * into v_emp from ac01 where AAE005 = '12322';
  
  dbms_output.put_line('姓名:' || v_emp.aac003 || ',单位id:' || v_emp.sab004);
  
end;

if …else

-- 查询判断ac01表中的记录数
declare 
  -- 声明变量接收ac01表中的记录数
  v_count number;
begin
  select count(1) into v_count from ac01;
  
  dbms_output.put_line(v_count); -- 2954453条记录
  
  --判断打印
  if v_count>=2000000 then
    dbms_output.put_line('表ac01中的记录数超过了两百万,为:'||v_count||'条。'); 
    elsif v_count>=1000000 and v_count<2000000 then
      dbms_output.put_line('表ac01中的记录数在一百万到两百万之间,为:'||v_count||'条。'); 
      else
        dbms_output.put_line('表ac01中的记录数在一百万以下,为:'||v_count||'条。');
        end if;
end;

循环

– 查询判断ac01表中的记录数
declare
– 声明循环变量
begin

​ loop

​ exit when number>10;

​ dbms_output.put_line(number);

​ number=number+1;

​ end loop;

end;

游标

用于临时存储一个查询返回的多行数据(类似于java中jdbc连接返回的结果集ResultSet),通过遍历游标,可以逐行访问处理该结果集的数据。

游标使用步骤:声明—>打开—>读取—>关闭

无参游标

-- 使用游标查询ac01表中所有用户的名字和单位id
declare
  -- 声明游标
  cursor c_ac01 is
    select aac003, sab004 from ac01;
  --声明变量接受游标中的数据
  v_name ac01.aac003%type;
  --单位id
  v_sal ac01.sab004%type;
begin
  --打开游标
  open c_ac01;

  --遍历游标
  loop
    --获取游标中的数据
    fetch c_ac01
      into v_name, v_sal;
    exit when c_ac01%notfound;
    dbms_output.put_line('姓名:' || v_name || ',单位id:' || v_sal);
  end loop;

  --关闭游标
  close c_ac01;

end;

游标的属性

游标的属性返回值类型说明
%rowcount整型获得fetch语句返回的数据行数
%found布尔型若最近的fetch语句返回一行数据则为真,否则为假
%notfound布尔型若游标找不到元素时为真,否则为假
%isopen布尔型若游标打开时值为真,否则为假

有参游标

-- 传递一个参数5,查询部门号为5的所有用户的名字和单位id
declare
  -- 声明游标
  cursor c_ac01(v_部门号 ac01.部门号%type) is
    select aac003, sab004 from ac01
    where 部门号 = v_部门号;
  --声明变量接受游标中的数据
  v_name ac01.aac003%type;
  --单位id
  v_sal ac01.sab004%type;
begin
  --打开游标 同时传递一个参数5,查询部门号为5的所有用户的名字和单位id
  open c_ac01(5);

  --遍历游标
  loop
    --获取游标中的数据
    fetch c_ac01
      into v_name, v_sal;
    exit when c_ac01%notfound;
    dbms_output.put_line('姓名:' || v_name || ',单位id:' || v_sal);
  end loop;

  --关闭游标
  close c_ac01;

end;

oracle存储过程

无参存储过程

首先通过Procedures创建存储过程

create or replace procedure study01 is
--声明变量
begin
  dbms_output.put_line('hello world');
end study01;

通过PL/SQL工具 Test Window调用存储过程

begin
  --通过plsql调用存储过程
  study01;
end;

有参存储过程

通过传入ac01.aae005参数来查询用户的姓名和单位ID

create or replace procedure study02(i_id in ac01.aae005%type) is
  --声明变量
  v_name ac01.aac003%type;
  --单位id
  v_sal ac01.sab004%type;
begin
  
  --查询ac01表中的某个用户的姓名和单位ID并赋值给变量
  select aac003,sab004 into v_name,v_sal from ac01 where aae005 = i_id;
  dbms_output.put_line('姓名:' || v_name || ',单位id:' || v_sal);

end study02;
begin
  --通过plsql调用存储过程
  study02('12322');  --传递参数
end;

带输出参数的存储过程

--输入aae005查询某个用户('12322')信息,将单位ID作为返回值输出,给调用程序使用
create or replace procedure study03(i_id in ac01.aae005%type, o_sal out ac01.sab004%type) is
begin
  --查询ac01表中的某个用户的姓名和单位ID并赋值给变量
  select sab004 into o_sal from ac01 where aae005 = i_id;
  
end study03;

调用

declare
  --声明变量接收存储过程中的输出参数(单位ID)
  v_sal ac01.sab004%type;

begin
  --通过plsql调用存储过程
  study03('12322',v_sal);
  dbms_output.put_line(v_sal);
end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

绿茵程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值