PL/SQL 编程
全称:Procedural Language(过程式的语言) /Structured Query Language(结构化查询语言)
/简介:PL/SQL Developer是一个集成开发环境,专门开发面向Oracle数据库的应用。
PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。
PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,
所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,
通过逻辑判断、循环等操作实现复杂的功能或者计算。PL/SQL 只有 Oracle 数据库有。
MySQL 目前不支持 PL/SQL 的,但支持Navicat Premium。/
PL/SQL 格式:
declare
变量的声明
begin
主体逻辑
exception
异常的处理
end;
1.变量的声明
v_xxxx 变量类型 ; (变量名 尽量加 v_ 前缀, 避免与后续出现的字段名 和表名 混淆 )
变量 := 值 ; 为 变量赋值 , 区分于 where 子句中的 比较 等号
2.begin 块的编写
在查询 中 为 变量 赋值 , 将查询结果 赋值给 声明过的 变量
语法: select 字段名 into 变量名
或者 select 字段1,字段2,... into 变量1,变量2,...
注意: 一个普通变量 只能存储一个值
- 输出语句
DBMS_OUTPUT.PUT_LINE(输出内容);
(DBMS : DataBase Management System)
4.变量类型
为了 使变量 能够 正常地盛放 查询结果数据, 变量类型 和长度 最好与 相应的 字段 一致
%TYPE : 可以 直接 根据 表结构 中的 字段类型 , 来 自动隐式 设定 所声明变量的 具体数据类型和长度
该写法 可以保证 所声明变量的类型 与 对应的 字段 类型 100% 吻合 , 程序 安全性更高
具体用法: 变量名 表名.要参照的字段%type ; 参照表的某个字段类型 来设定变量类型OWTYPE : 可以用来定义 行变量, 其类型 参照 某个表的 所有 字段类型
该类型的变量 可以 存储 一整条记录
具体用法 : 变量名 表名%ROWTYPE ;
获取 其中各个字段值的方法: 行变量.字段名
优势: 避免了 过多地定义普通变量, 用以接受 查询结果中的 各个字段值
record : 通过 声明 记录类型, 可以 将多个 变量 自由组合 到一个记录类型中
record 类型 的变量 相当于一个 复合类型的复杂变量,内层又包含多个变量值
相比 ROWTYPE 更灵活
table(索引表) : 可以存放 多列 多行 结果
用法: type 自定义名称 is table of 表名%rowtype index by binary_integer;
select *
from emp; --查询数据库中的 emp表
– 编写一个简单的 PL/SQL
– 根据员工 编号, 查询 员工姓
declare
v_empno number(8):=7788; -- 声明变量,存储员工编号
v_ename varchar2(20); -- 声明变量,存储 员工姓名
begin
select ename into v_ename -- 将查询到的 员工姓名 存入 变量 v_ename 中
from emp
where empno = v_empno;
dbms_output.put_line(v_ename); -- 输出变量v_ename 的值
-- DBMS 数据库管理系统 (Data Base Management System)
end;-- 结束语句
– %type 的 使用
– 根据员工编号, 查询 员工 姓名
declare
v_empno emp.empno%type :=7788; -- 声明变量v_empno,用来存储员工编号(已知)
v_ename emp.ename%type; --声明变量v_ename,用来存储 员工姓名(未知)
begin
select ename into v_ename -- 将查询到的 ename结果 赋值 给(into) 变量v_ename
from emp --在表 emp 中 查询
where empno= v_empno; -- 当 表内的 员工编号 与 声明的员工编号 变量 值 相等时
DBMS_output.put_line(v_ename||','||v_empno);
end;
-- 根据员工编号, 查询 员工 姓名
-- %rowtype 的 使用
declare
v_empno emp.empno%type := 7788; -- 声明 一个变量 v_empno用来存放 编号
v_emp emp%rowtype; -- 声明一个表v_emp
begin
select * into v_emp -- 将查询到的结果集 赋予 表 v_emp
from emp
where empno=v_empno; -- 当 emp表中的 empno 和声明的v_empno 相等时
dbms_output.put_line('员工编号:'||v_emp.empno||'员工姓名:'||v_emp.ename);
end;
– record 的 使用 (record vt.记录)
-- 查询 emp 中的 所有 字段
declare
type emp_record is record( -- 声明 一个记录类型
ename emp.ename%type,
job emp.job%type, --??????
sal emp.sal%type
);
v_empno emp.empno%type :=7788; -- 声明变量 用来存储 员工编号
v_emp_record emp_record; -- v_emp_record 作为 行变量,用来存储一整条记录
begin
select ename,job,sal into v_emp_record -- 将查询到的员工姓名 存入 v_emp_record
from emp
where empno = v_empno;--当 emp表中的 empno 与变量 v_empno 相等时
dbms_output.put_line(v_emp_record.ename);
end;
– table (索引表)
-- 查询 emp 中的 所有字段
declare
type emp_table is table of emp%rowtype --声明索引表的 类型(在PL/SQL中将一个记录声明为具有相同类型的数据库行)
index by binary_integer; --指定索引 (自加)为整数索引 --binary_integer(二进制 的 整数 )
v_emp_table emp_table; --为变量v_emp_table 指定 类型
begin
select * into v_emp_table(0) -- 将查询到的 ename结果集 赋予 v_emp_table(0)--索引为0的索引表中
from emp
where empno=7788;
select * into v_emp_table(1) -- 将查询到的 ename结果集 赋予 v_emp_table(0)--索引为1的索引表中
from emp
where empno=7369;
dbms_output.put_line('员工姓名:'||v_emp_table(0).ename); --输出 语句 oracle中的连接符是'||'
dbms_output.put_line('员工姓名:'||v_emp_table(1).ename);
end;