PL/SQL简介(一)

2014-11-24 16:26:45 · 作者: · 浏览: 0

前言
正文
PL/SQL
(Procedure Language,过程化语言)SQL 1999各大数据库厂商通用的一种结构化语言 PL/SQL只支持Oracle数据库
基本语法
多行注释 /* */ 单行注释 --
PLSQL程序块

结构
[declare]
定义变量
begin
过程语句
[exception]
处理 异常
end;

例子 输出helloworld
begin
dbms_output.put_line('hello');
end;
--如果过程执行完没有输出,必须将服务器输出打开

执行

SQL> set serveroutput on/off;
SQL>
SQL> begin
2 dbms_output.put_line('hello');
3 end;
4 /

hello

PL/SQL procedure successfully completed

变量
declare
变量名称 变量类型;
begin

end;
标识符:不能以数字开始 长度不能超过30个字符
变量初始化
采用:= 进行赋值
v_age number(10) := 10;
变量类型

number(m,n) 数字类型
char() 固定长度字符串
varchar2() 可变长度字符串
date 日期类型
boolean(true/false/null) 布尔类型
binary_integer 有符号整型
注意:布尔类型不能直接输出


代码示例:

注意:变量名称不能是SQL关键字,最好不要和表中字段同名
变量命名:
v_实际含义的单词
常量命名:
c_实际含义
参数命名
p_实际含义
游标类型
名称_cursor
表类型
名称_table
记录类型
名称_record
变量作用域
变量从声明开始到对应模块的end结束为它的作用域

--变量作用域代码示例
变量的其他类型
1.表类型

定义表类型
type 表类型名称 is table of 表类型存储的基本类型 index by binary_integer
声明变量为表类型
变量名称 表类型名称

表类型类似java中的数组,用来存储具有同种类型的数据

属性:
first 表示获得表类型的第一个下标
last 表示获得表类型的最后一个下标
count 表示表类型的数据个数
next(下标) 表示下一个下标
prior(下标) 表示前一个下标
代码示例:

表类型通过下标操作
2.记录类型
用来存储一条记录
type 记录类型名称 is record(field1 类型,field2 类型)
定义变量,将变量类型设置成记录类型
v_record 记录类型名称
代码示例
定义记录类型的简单方式
%rowtype 定义记录类型
表名%rowtype
代码示例

定义表类型的简单方式
%type 定义表类型
表名.字段名%type
代码示例

代码示例: 将表中的所有记录存在一个变量中

操作符
算数运算符

跟java一致
v_age number(3) := 0;

v_age := v_age +1;

比较运算符

> < >= = 不等于!= <> ~= ^=

逻辑运算符

and or not

between and

赋值运算符

:=

流程控制

分支:

1.if分支
if 布尔表达式 then
…………
else
…………
end if;

多个分支:
if 布尔表达式 then
…………
elsif 布尔表达式 then
…………
elsif 布尔表达式 then
…………
else
…………
end if;

案例: --查找员工,根据职位进行工资的增加

2.case分支,类似java中的switch````case

case 变量
when 条件 then
语句·····
when 条件 then
语句·····
when 条件 then
语句·····
else
语句·····
end case;

案例

循环:

1.loop循环

定义一个循环指数
v_index binary_integer := 0;

loop
if v_index=循环次数 then
exit;
end if;
循环体

循环指数自增
v_index := v_index+1;

end loop;
案例:
--loop循环
declare
--定义循环指数
v_index binary_integer :=1;
begin
--定义loop循环
loop
--定义推出循环的条件
if v_index=5 then
exit;
end if;
--执行循环体
dbms_output.put_line(v_index);
--循环指数自增
v_index := v_index+1;
end loop;
end;

2.for循环

定义一个循环指数
v_index binary_integer;

for 循环指数 in 下限指数..上限指数 loop
循环体
end loop;

案例:
--for循环

注意:循环指数的开始一定要小于结束

通过reverse关键字实现循环反转

--for循环反转
declare
v_index binary_integer;
begin
for v_index in reverse 10..20 loop
dbms_output.put_line(v_index);
end loop;
end;

3.while循环

定义循环指数
v_index binary_integer := 1;

while 布尔表达式 loop
循环体
循环指数自增
end loop;

案例:
--while循环
declare
v_index binary_integer := 1;
begin
while v_index<5 loop
dbms_output.put_line(v_index);
v_index := v_index+1;
end loop;
end;

循环嵌套

通过<

案例:

4.goto跳转

PL/SQL中书写定义sql

1.DQL语言

select 语句要求:1.必须写into关键字
2.查询语句只能有一条返回值
异常示例: 没有值 no_data_found;值过多 too_many_rows

2.DML(insert/update/delete)

注意:执行DML语句要处理事务

动态传参
&+变量来实现动态传参


--执行DML语句
declare
begin
--普通DML语句
delete from emp where empno=&xx;
--事务处理
commit;
end;

3.DDL(create/drop/alter/truncate)

DDL语句要在 execute immediate('DDL')

游标(cursor)

sql语句执行时会在内存中开辟一个区域,用来存放执行的sql语句以及返回的数据,我们把这个内存区域叫做上下文环境(context);游标就是指向这个上下文环境的指针。


游标分类
隐式游标:由数据库管理系统创建执行
显示游标:有程序员负责创建执行和关闭的游标

游标的属性
%rowcount 存储的是游标执行时所影响的记录条数
操作属性
显示游标:自定义游标名称%rowcount
隐式游标:sql%rowcount
%found 判断当前数据有没有下一条 true/fase
%notfound 判断当前数据有没有下一条 true/fase
%isopen 判断游标是否开启

显示游标

1.创建游标
cursor 游标名称 is 查询语句
2.开启游标
open 游标名称
3.获取数据
fetch 游标名称 into 变量
4.关闭游标
close 游标名称

案例: --显示游标

for循环来循环游标

定义游标时传递参数

注意:设置形参时不要写参数的长度,实参是在开启游标的时候传递
游标不能重复开启和关闭

定义游标类型的变量

1.定义游标类型

type 游标类型名称 is ref cursor return 返回