PL/sql 编程基础
提示:PLSQL 编写不区分大小写
程序结构
PLSQL 程序可以分为三部分:申明部分,可执行部分,异常处理部分
DECLARE
-- 生命变量,游标
INTEGER;
BEGIN
-- 执行语句
-- 打印hello world
DBMS_OUTPUT.PUT_LINE('hello world');
-- 【异常处理】
END;
其中DBMS_OUTPUT 为Oracle内置程序包,相当于Java中的System.out,PUT_LINE是调用的方法,相当于println方法。
变量
PL SQL 编程中常见变量分两大类
1:普通数据类型(char,varchar2,date,number,boolean,long);
2:特殊变量类型(引用型变量,记录型变量)
普通变量
变量名 变量类型(变量长度)
例如:v_name carchar2(20)
变量赋值的方式有两种
1:直接赋值语句 :=
2:语句赋值,使用select into 赋值:
DECLARE
v_name varchar2(20) := '法外狂徒张三';
v_age number;
v_addr varchar2(100);
BEGIN
v_age := 250;
select '法外之地' into v_addr from DUAL;
DBMS_OUTPUT.PUT_LINE('姓名' || v_name || '年龄' || v_age || '法外之地' || v_addr);
END;
引用型变量
变量的类型和长度取决于表中字段的长度
通过表名.列名%TYPE指定变量的类型和长度,例如:v_name bobo.ename%TYPE
DECLARE
v_name bobo.ename%TYPE := '波波要波波';
v_age bobo.eage%TYPE;
BEGIN
-- 查询表中的姓名和年龄并赋值给变量
-- 注意:查询的字段和赋值的变量的顺序,个数,类型要一致
select ename, eage into v_name , v_age from bobo where id = 1;
END;
引用类型的好处:
使用普通变量定义方式,需要知道提前知道列的类型,而使用引用类型,则不需要考虑列的类型,使用%TYPE也可以使得PLSQL更加灵活,更加适应于数据库定义的更新。
记录型变量
接受数据表中的一整行数据,相当于Java中的一个对象
语法:变量名称 表名%ROWTYPE,例如:v_cattle cattleBrave%rowtype;
示例:
-- 查询id为5的用户信息
DECLARE
-- 记录型变量接受一行数据
v_user bobo%ROWTYPE;
BEGIN
-- 记录型变量默认接受一行数据,不能指定字段,否则报错
select * into v_user from bobo where id = 5;
DBMS_OUTPUT.PUT_LINE('姓名' || v_user .name || '年龄' || v_user.age);
END;
如果表中字段过多几十上百个,那么我要使用其中几十个字段,用普通或者引用型变量就需要一个个声明,会特别麻烦,记录型变量可以方便的解决这个问题
流程控制
条件分支
语法:
BEGIN
IF 条件1 THEN 执行1
ELSIF 条件2 THEN 执行2
ELSE 执行3
--每次开始开启都要使用END结束
END IF;
循环
语法:
BEGIN
LOOP
EXIT WHEN 推出循环条件
END LOOP;
END;
游标
什么是游标
用于临时存储一个查询返回的多行数据(结果集,类似Java的ResultSet集合,js的数组),通过遍历游标,可以逐行访问处理结果集的数据
游标的使用方式:声明 --> 打开 --> 读取 --> 关闭
语法
声明:
CURSOR 游标名[(参数列表)] IS 查询语句;
游标的打开
OPEN 游标名;
游标的取值:
FETCH 游标名 INTO 变量列表;
游标的关闭
CLOSE 游标名;
游标的属性
%ROWCOUNT 返回值为整形 获得FETCH语句返回的数据行数
%FOUND 返回值为布尔值 最近的FETCH语句返回一行数据则为真,否则为假
%NOTFOUND 返回值为布尔值 与%FOUND属性返回值相反
%ISOPEN 返回值为布尔值 游标已经打开时值为真,否则为假
示例:
DECLARE
-- 声明游标
CURSOR c_bobo IS select name,age from bobo;
-- 定义变量
v_name bobo,name%TYPE;
v_age bobo.age%TYPE;
BEGIN
-- 打开游标
OPEN c_bobo;
-- 遍历游标
LOOP
-- 获取游标中的数据
FETCH c_bobo INTO v_name,v_age;
-- 退出循环条件
EXIT WHEN c_bobo%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('姓名' || v_name || '年龄' || v_age);
-- 结束循环
END LOOP;
-- 关闭游标
CLOSE c_bobo;
END;
游标传参
游标传参比较简单
-- 声明游标的时候写入形参
CURSOR c_bobo(v_id bobo.id%TYPE) IS select name,age from bobo WHERE id = v_id;
-- 接下来在打开游标的时候传入
OPEN c_bobo(10);