1 . 什么是pl/sql?
pl/sql是oracle对sql语言的过程化扩展,指在sql命令语言中增加了过程处理语句(如分支,循环等),使sql语言具有过程处理能力。
2 .变量
普通数据类型(char,varchar2,date,number,boolean,long)
特殊变量类型(引用类型变量,记录型变量)
普通变量:
1. 直接复制语句 := 如:v_name='zhangsan'
2. 语句赋值,使用select...into ...赋值: (语法 select 值 into 变量)
【实例】
-- 打印个人信息,包括:姓名,薪水,地址
declare
--姓名
v_name varchar2(20) :='zhangsan';
--薪水
v_sal number;
--地址
v_address varchar2(50);
begin
-- 直接赋值
v_sal:=8000;
--语句赋值
select '贵阳市观山湖区' into v_address from dual;
--打印输出
dbms_output.put_line('姓名:'||v_name||',薪水:'||v_sal||',地址:'||v_address);
end;
引用型变量
变量的类型和长度取决于表中字段的类型和长度
通过表名.列名%TYPE指定变量的类型和长度,如: v_name emp.ename%TYPE;
【案例】
-- 引用型变量打印个人信息,包括:姓名,薪水, 查看emp表ename,sal赋值给定义的变量,v_name的长度,类型取决于emp.ename长度
declare
--姓名
v_name emp.ename%TYPE;
--薪水
v_sal emp.sal%TYPE;
begin
--语句赋值
select ename,sal into v_name,v_sal from emp where empno=7839;
--打印输出
dbms_output.put_line('姓名:'||v_name||',薪水:'||v_sal);
end;
引用型的好处:
使用普通变量定义方式,需要知道表中列的类型,而使用引用类型,不需要考虑类的类型和长度,使用%TYPE是非常号的编程风格,因为它使得PL/SQL更加灵活,更加具有对数据库定义的更新
记录型变量
接收表中一整行记录,相当于java中的一个对象
语法:变量名称 表名%ROWTYPE, 例如: v_emp emp%rowtype;
【案例】
-- 记录型变量打印个人信息,包括:姓名,薪水
declare
--记录型变量接收一行
v_emp emp%ROWTYPE;
begin
--语句赋值
select * into v_emp from emp where empno=7839;
--打印输出
dbms_output.put_line('姓名:'||v_emp.ename||',薪水:'||v_emp.sal);
end;
如果有一个表,有100个字段,那么程序如果要使用这100个字段,如果使用引用型变量一个个声明,会特别麻烦,记录型变量可以方便的解决这个问题
错误的使用;
记录型变量只能存储一个完整的行数据
流程控制
语法:
begin
if 条件1 then 执行1
elsif 条件2 then 执行2
else 执行3
end if;
declare
--声明接收的数量
v_count number;
begin
select count(1) into v_count from emp;
if v_count > 20 then
dbms_output.put_line('emp表中的数量超过20条为:' || v_count);
elsif v_count >= 10 then
dbms_output.put_line('emp表中的数量在10-20之间,条为:' || v_count);
else
dbms_output.put_line('emp表中的数量小于10条为:' || v_count);
end if;
end;
循环
在ORACLE中有三种循环方式,这里只介绍一种:loop循环
语法
BEGIN
LOOP
EXIT WHEN 退出循环条件
END LOOP;
END;
【案例】
--循环打印1-10
declare
--声明循环变量
v_num number := 1;
begin
loop
exit when v_num > 10;
dbms_output.put_line(v_num);
--循环变量的自增
v_num := v_num + 1;
end loop;
end;
无参游标
什么是游标?
用于临时存储一个查询返回的多行数据(结果集,类似于java的jdbc连接返回的ResultSet集合),通过遍历游标,可以逐行访问处理该结果集的数据。
游标的使用方式:声明--->打开--->读取--->关闭
1 . 语法
游标声明:
CURSOR 游标名【参数列表】 IS 查询语句;
游标的打开:
OPEN 游标名:
游标的取值:
FETCH 游标名 INTO 变量列表:
游标的关闭:
CLOSE 游标名;
2 . 游标的属性
游标的属性 返回值类型 说明
%ROWCOUNT 整型 获得FETCH语句返回的数据行数
%FOUND 布尔型 最近的FETCH语句返回一行数据则为真,否则为假
%NOTFOUND 布尔型 与%FOUND属性返回值相反
%ISOPEN 布尔型 游标已经打开时值为真,否则为假
3 .创建和使用
--使用游标查询emp表中员工名字,工资并且打印出来
declare
--声明游标
cursor c_emp is
select ename, sal from emp;
--声明变量接收游标的数据
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
begin
--打开游标
open c_emp;
--遍历游标
loop
--获取游标中的数据
fetch c_emp
into v_name, v_sal;
--退出循环条件 %NOTFOUND:表示没有数据, 则退出循环
exit when c_emp%NOTFOUND;
--输出
dbms_output.put_line('姓名:' || v_name || ',薪水:' || v_sal);
end loop;
--关闭游标
close c_emp;
end;
有参游标
--使用带参数游标查询emp表中员工名字,工资并且打印出来, 如果说打开游标传入的参数为10,则值查询empno=10的所有员工
declare
--声明游标
cursor c_emp(v_deptno emp.empno%TYPE) is
select ename, sal from emp where deptno = v_deptno;
--声明变量接收游标的数据
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
begin
--打开游标
open c_emp(10);
--遍历游标
loop
--获取游标中的数据
fetch c_emp
into v_name, v_sal;
--退出循环条件 %NOTFOUND:表示没有数据, 则退出循环
exit when c_emp%NOTFOUND;
--输出
dbms_output.put_line('姓名:' || v_name || ',薪水:' || v_sal);
end loop;
--关闭游标
close c_emp;
end;