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;