【PL/SQL编程基础】
语法:
declare
声明部分,例如定义变量、常量、游标
begin
程序编写,SQL语句
exception
处理异常
end;
/ 正斜杠表示执行程序快
范例
-- Created on 2016/8/22 by VITAS
declare 定义变量
v_num number;
v_eno number;
v_ename varchar2(10);
begin
v_num:=234;
v_eno:=&empno; 接收输入变量
select ename into v_ename from emp where empno=v_eno;
DBMS_OUTPUT.put_line(v_ename);
end;
/
变量的声明和使用
PLSQL是一种强类型的编程语言,变量名前加v表示变量
语法:
所有的变量都要求在declare部分之中进行,可以在定义的时候赋默认值,变量声明语法如下:
变量名[constant] 类型 [not null][:=value]
declare
v_resultA number;
v_resultB number :=100;
v_resultC constant number:=14;
begin
v_resultA:=10;
dbms_output.put_line('result 的值是:'||(v_resultB+v_resultA+v_resultC));
end;
/
使用%type定义变量
使用%rowtype声明变量,可以定义表中一行记录的类型
运算符:
掌握变量的声明和使用
掌握%type和%rowtype的使用
PL/SQL分支语句
if/else
循环:
loop:
语法:
loop
exit when 循环结束条件
end loop
while() loop
end loop;
for:
for 循环索引 in 循环区域下线..循环区域上线 loop
end loop;
goto语句:
goto endpoint
<<endpoint>>
异常处理:
1、编译时异常,无法处理
2、运行时异常:用户可以处理的只有运行时异常
异常处理要使用EXCEPTION子句处理,通过when子句对异常处理
when 异常类型|用户自定义异常|异常代码|other then
异常处理
产生异常后继续执行其他代码
记录类型:
定义记录类型语法:
type 类型名 is record(
成员名 数据类型 [[not null][:=默认值] 表达式],
......
成员名 数据类型 [[not null][:=默认值] 表达式]
)
嵌套记录类型
雇员中包含部门信息
插入复合数据类型
insert into dept values v_dept
更新复合数据类型
update dept set ROW=v_dept where deptno=v_dept_deptno;
索引表的概念(数组)
索引表类似于程序语言中的数组,可以保存多个数据
区别:不需要初始化
索引:数字或者字符串,下标可以设置为负数
语法:
type 类型名称 is table of 数据类型【not null】
index by [pls_integer|binary_interger|varchar2]
访问没有定义的索引,会出现数据找不到的异常,但是索引的下标不是顺序的,所以索引值可能不存在,一次提供exists(index)判断是否存在
范例:使用字符串作为字符索引
范例:使用rowtype数组
范例:使用记录类型数组
嵌套表:(跳过)start
1、定义简单类型的嵌套表
CREATE [OR REPLACE] TYPE 类型名称 AS|IS TABLE OF 数据类型 [not null];/
create or replace type project as table of varchar2(20);
集合运算符:
集合函数:count、first last
集合异常处理:
跳过 end
使用forall批量处理:
使用for in:(更新n次)
for xx in 集合 first..last loop
end loop
2、使用forall:(批处理更新数据)
语法:
forall x in 集合 first..last
update.....
批量接收数据:
bulk collect into
子程序:
目标
1、掌握子程序的分类
包含存储过程和函数
定义过程:
专门定义一组sql语句集
语法:
过程=声明+plsql快
CREATE [OR REPLACE] PROCEDURE 过程名 (参数名[模式in/out/in out] nocopy 数据类型,....)
as|is
[pragma autonomous_transaction]
声明部分:
begin
exception when others then
rollback
end 过程名
过程没有返回值
create or replace procedure ChangePassword(userName in out varchar2,
password in out varchar2) is
pragma autonomous_transaction;
v_result boolean;
begin
v_result := login(userName, password);
end ChangePassword;
范例:定义一个过程
过程定义完之后要通过exec 过程名 执行过程
范例:
定义过程根据雇员编号找到姓名和工资
函数:
用户定义的sql语句或者plssql直接调用,函数和过程的最大区别在于函数可以返回值,而过程智能通过in和out来返回数据,
语法如下:类型为numnber或者varchar时不需要定义长度否则编译不能通过
CREATE [OR REPLACE] FUNCTION 过程名 (参数名[模式] nocopy 数据类型,....)
return 返回值类型
as|is
[pragma autonomous_transaction]
声明部分
begin
return 返回值;
exception when others then
rollback
end 函数名
create or replace function LOGIN(userName in out varchar2,
password in varchar2) return boolean is
v_isLogin boolean;
--定义rowtype
userrow T_USER%ROWTYPE;
--定义元素为rowtype类型的集合
type UserInfo is table of T_USER%ROWTYPE index by binary_integer;
--定义类型后需要对定义类型变量
users UserInfo;
--定义记录类型
type userRecord is record(
id number(10),
userName varchar2(32),
password varchar2(32),
roleId number(10));
userR userRecord;
--定义自定义事务,此事务的rollback和commit不会影响到主事务
pragma autonomous_transaction;
begin
--使用bulk collect into批量查询赋值
select * into userR from T_USER where userName = 'YWP';
userR.userName := 'zp';
insert into T_USER VALUES userR;
commit;
select *
BULK COLLECT
INTO users
from T_USER
where username = userName
and password = password;
if users.count != 0 then
dbms_output.put_line('welcome login my system!');
else
dbms_output.put_line('用户名或密码错误');
end if;
exception
when others then
dbms_output.put_line('313');
/* --使用for in遍历集合
for i in users.first .. users.last loop
--输出变量时先判断下标是否存在
if users.exists(i) then
dbms_output.put_line('welcome login my system!');
end if;
end loop;*/
userName := 'ywp';
return(v_isLogin);
end LOGIN;
2、掌握子程序的定义和区别
子程序的参数模式
形参定义有三种
in:(默认值),子程序中所做的修改不会影响原始参数(基本数据类型的传递)
out:不带任何数值的子程序中,子程序可以通过此变量将数值传到调用处(引用数据类型的传递)
inout,可以将值传到子程序中,兵将子程序对变量的修改返回到调用处
nocopy子选项:将参数变为引用传递,in和out为复制传递参数
自治事务:
在oracle中每个session都有独立的事务,
启动子事务
利用java调用子程序