1.2 plsql结构
PL/SQL可以分为三个部分:声明部分、可执行部分、异常处理部分。
declare
--声明变量,游标
i integer;
begin
--执行语句
--【异常处理】
end;
1.3 hello world
declare
i integer
begin
DBMS_OUTPUT.PUT_LINE('HELLO WORLD');
END;
说明:如果没有显示打印内容,可以通过以下设置进行设置
1.4 变量
PLSQL编程中常见的变量分两大类:
1、普通数据类型(char、varchar2、date、number、boolean、long)
2、特殊变量类型(引用型变量、记录型变量)
声明变量的方式
-- 变量名 变量类型(变量长度)
v_name varchar(20)
1.4.1 普通变量
变量赋值的方式有两种:
1、直接赋值语句:= 比如: v_name :='zhangsan'
2、语句赋值,使用select...into...
赋值
【示例】打印人员个人信息,包括:姓名,薪水,地址
declare
--姓名
v_name varchar2(20) :='zhangsan';
--薪水
v_sal number;
--地址
v_addr varchar2(200);
begin
--直接赋值
v_sal := 1580;
--语句赋值
select 'shanghai' into v_addr from dual;
DBMS_OUTPUT.PUT_LINE('姓名:'||v_name||',薪水:'||v_sal||',地址:’||v_addr);
end;
1.4.2 引用型变量
变量的类型和长度取决于表中字段的类型和长度
通过表名.列名%TYPE
指定变量的类型和长度,例如:v_name emp.ename%TYPE
;
【例子】查询emp表中7839 号员工的个人信息、打印姓名和薪水
declare
--姓名
v_name emp.ename%type :='zhangsan';
--薪水
v_sal emp.sal%type;
--地址
v_addr emp.addr%type;
begin
--直接赋值
v_sal := 1580;
--语句赋值
select 'shanghai' into v_addr from dual;
DBMS_OUTPUT.PUT_LINE('姓名:'||v_name||',薪水:'||v_sal||',地址:’||v_addr);
end;
1.4.3 记录型变量
接受表中的一整行记录,相当于java 中的一个对象
语法:变量名称 表名%rowtype,例如:v_emp emp%rowtype;
【例子】查询打印123号员工的姓名和薪水
declare
v_emp emp%rowtype;
begin
select * into v_emp from emp where empno = 123;
DBMS_OUTPUT.PUT_LINE('姓名:'||v_emp.ENAME||',薪水:'||v_emp.sal||',地址:’||v_emp.addr);
END;
使用场景:如果表字段比较多的时候,声明变量会变得比较麻烦,可以使用记录型变量解决这个问题。
说明:
1、记录型变量只能存储一个完整的行数据
2、查询返回的行数太多,记录型变量接收不了。
1.5. 流程控制
1.5.1 条件分支
语法:
begin
if 条件1 then 执行1
elsif 条件2 then 执行2
else 执行3
end if;
end;
1.5.2 循环
Oracle 中有三种循环方式,我们这说的是其一 loop循环
语法:
begin
loop
exit when 退出循环条件
end loop;
end;
【例子】
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;
2.游标
2.1 什么是游标
用于临时存储一个查询返回的多行数据(结果集类似java找那个resultset集合),通过遍历游标,可以逐行访问处理该结果集中数据。
游标的使用方式:声明–>打开–>读取–>关闭
2.2 语法
游标声明:
cursor
游标名[(参数列表)] is 查询语句;
游标的打开:
open 游标名;
游标的取值:
fetch
游标名 into
变量列表;
游标关闭:
close
游标名
2.3 游标的属性
属性 | 返回值类型 | 说明 |
---|---|---|
%ROWCOUNT | 整形 | 获得fetch语句返回的数据行数 |
%FOUND | 布尔型 | 最近的fetch语句返回一行数据为真,否则为假 |
%NOTFOUND | 布尔型 | 与%FOUND相反 |
%ISOPEN | 布尔型 | 游标已经打开时为真,否则为假 |
%NOTFOUND
通常用来判断退出循环条件
2.4 创建和使用
【例子】使用游标查询emp表中所有员工姓名和工资
declare
--1、声明游标
cursor c_emp is
select ename,sal from emp;
-- 声明变量给游标复制
v_name emp.ename%type;
v_sal emp.sal%type;
begin
--2、打开游标
open c_emp;
loop
--3、游标取值
fetch c_emp into v_name,v_sal;
exit when c_emp%notfound;
dbms_output.put_line('姓名:'||v_name||'薪水:'||v_sal);
end loop;
--4、关闭游标
close c_emp;
end;