(三)PL/SQL
Procedure Language / SQL 存储过程
命名程序:存储过程,函数,触发器
--------------------------------------基础语法--------------------------------------------
1. 语句块:
begin
dbms_output.put_line('HelloWorld');
end;
2. 定义变量
declare
num number(4);
name varchar2(10);
begin
num := 1001;
name := 'amui'; -- :=是赋值操作
dbms_output.put_line(num || ':' || name); -- ||连接字符串,相当于+
end;
3. if语句
a) 示例1:
declare
age number(2);
begin
age := 19;
if age > 20 then
dbms_output.put_line('A');
else
dbms_output.put_line('B');
end if; --要记得end if
end;
b) 示例2:
4. case结构
5. 循环
a) loop循环语法实例:
b) while循环语法实例
c) for循环语法实例
6. PL语句与SQL语句结合使用
a) 示例1:插入一条数据:
其中,在declare定义语句中,v_empno emp.empno%type表示v_empno的类型是参考自数据库
中表emp中的属性empno的类型。
b) 示例2:查询数据(查询某个具体值,将其赋给PL中的变量)
注意与常规SQL语句不一样
select ename into v_ename from emp where empno = v_empno;
c) 示例3:
语句 v_emprowData emp%rowtype; 表示变量 v_emprowData 参考自表emp中的一行数据。
变量v_emprowData 相当于一个对象。
--------------------------------------存储过程------------------------------------------
1. 存储过程定义:(无参存储过程)
2. 调用存储过程的方式:
a) 命令调用:
exec my_pro1;
b) 过程调用:
begin
my_pro1;
end;
c) 使用Java程序调用:
{call my_pro1}
3. 有参存储过程:
a) 需求:创建一个存储过程,根据员工编号返回员工信息。
在该参数列表中,可以写成 v_empno number , 但是number上不能标识长度大小。
in 表示传入的参数,out表示传出参数,即返回值。
b)调用带有输入参数和输出参数的存储过程:
不能使用命令调用带有输出参数的存储过程!
4. 自联表
如果输入输出参数的类型一样,可以简写如下:
-----------------------------------------程序包---------------------------------------------
程序包:用于存储过程,函数,类型
1. 定义程序包:
2. 创建包体,包体的名字和包名相同
3.调用包中的存储过程
exec mypack1.mypro1;
----------------------------------------游标---------------------------------------------
游标:cursor,一个内存区域,不是类型
1. 需求:创建返回一个表中多条记录的存储过程(使用游标,创建一个参照游标特性的类型)
a) 获取一条数据:
b) 循环获取多条数据:
mycursor%found 表示判断,判断是否是否存在
2.在程序包中定义参照游标的类型
a) 需求:创建一个存储过程,返回EMP表所有记录
1)创建程序包,包中定义类型
2)调用包:参数中需要用到参照游标特性的类型,需要调用包
以下示例功能是根据每页数据数算出最大页数,同时返回从某一页的数据。
3)测试:
来源:oschina
链接:https://my.oschina.net/u/1435117/blog/508685