一、存储过程
存储过程的英文是procedure,是SQL语句集,属于函数的一种,目的是使数据库编程化;
什么是PL/SQL?
PL/SQL 是Oracle数据库独有的语言,是SQL语句的扩展,是面向过程的语言(换句话说,是过程化SQL)实现了sql的可编程化。
PL/SQL写在存储过程中;JAVA写在类里面;
二、存储过程语法
1.创建
CREATE OR REPLACE PROCEDURE 存储过程名 [(参数1,参数2,…)]
IS
BEGIN
END 存储过程名;
注:
1. create 和 is 之间,用来声明存储过程的参数,可以是一个,可以是多个,也可以省略不写。
2. 如何区分参数的类型,使用in 和out关键
3. is 和begin之间,用来声明变量
4. begin 和 end 之间,用来编写存储过程的执行内容
2.变量
变量名 数据类型[(长度)]
例:v_a number
v_b varchar2(20)
记录类型
定义:记录类型是由多个变量组成的用户自定义类型
作用:将多个变量整合到一起,使用record关键字来声明记录类型。
语法:
type 记录类型名 is record
(
变量名 数据类型[(长度)],
变量名 数据类型[(长度)],
…
);
例子:
type student_recor is record
(
v_name student.name%type,
v_class student.class%type
)
方法二:
--用%rowtype动态获取某表所有字段信息(字段名&数据类型)
--使用方法同记录类型
v_a emp%rowtype;
select * into v_a from emp where no = 0001;
dbms_output.put_line(v_a.name);
动态数据类型
当我们不清楚要声明的变量,或者记录类型中包含的变量的数据类型时,可以采用动态获得数据类型的方式。
语法:
变量名 表名.列名%type
例:v_name emp.name%type;
3.条件分支
IF语法
IF 条件 THEN 满足条件后的执行体
[ELSIF 条件 THEN 满足条件的执行体]
ELSE 未满足条件的执行体
END IF;
CASE语法
CASE
WHEN 比较值 THEN 执行体
WHEN 比较值 THEN 执行体
…
ELSE 未比较成功的执行体
END CASE;
4.循环
语法1(类似于JAVA的while循环)
WHILE 循环条件 LOOP
循环体
END LOOP;
语法2(类似于JAVA的for循环)
FOR 循环变量名 IN [REVERSE] 循环次数 LOOP
循环体
END LOOP;
--利用reverse关键字可以使for循环进行逆序
语法3(类似于JAVA的do-while循环)
LOOP
循环体
EXIT WHEN 循环条件;
END LOOP;
5.游标
游标由一个结果集和一个指针组成,结果集可以包含多行多列的数据,是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
游标写法
--第一步:创建游标
CURSOR 游标名 IS 查询语句;
--第二步:打开游标(形成指针)
OPEN 游标名
--第三步:利用指针,从游标中取值,将取到的值装进变量中存储
FETCH 游标名 INTO 变量
--第四步:输出变量中的内容
dbms_output.put_line();
--第五步:关闭游标
CLOSE 游标名;
隐式游标
游标分为两种,一种是显示游标,一种是隐式游标
显示游标是我们自己定义出来的游标,
隐式游标是在执行DQL语句时,数据库自动生成的游标,统一命名sql
游标(不论显示还是隐式)常用的属性:
%found
%notfound
%isopen
%rowcount
6.带参存储过程
参数类型:输入参数/输出参数
CREATE OR REPLACE PROCEDURE 存储过程名
(
参数名 IN/OUT 数据类型,
参数名 IN/OUT 数据类型,
…
参数名 IN/OUT 数据类型
)
IS
BEGIN
END 存储过程名;
--先定义参数名,
然后用关键字IN或者OUT来确定参数的类型,
IN代表输入参数(相当于JAVA方法中的形参),
OUT代表输出参数(相当于JAVA方法中的返回值),
然后数据类型的声明与变量数据类型的声明不同,
就是无需指定类型长度。
例:i_a in number
o_b out varchar2
7.存储过程调用
同JAVA方法之间的相互调用相同,存储过程之间也可以相互调用。
调用方式:
存储过程名(参数1,参数2,参数3,…)
说明:不论输入参数,还是输出参数,在调用存储过程时,都需要将参数列表填满,保证参数的数量,顺序,类型一致。
8.异常处理
例:CREATE OR REPLACE PROCEDURE GG.异常
IS
BEGIN
dbms_output.put_line(10 / 0);
dbms_output.put_line('哈哈');
exception
when zero_divide then
dbms_output.put_line('哈哈丢了');
END 异常;
常见的异常类型:
zero_divide:称作除数为0异常
no_data_found:称作数据没有找到异常
value_error:称作值错误异常
Oracle 数据库(一):Oracle 数据库(一)
后续补充