{}必选 []可选
目录
PL/SQL块结构
[declare]
--定义部分 ——定义常量、变量、游标、例外、复杂数据类型
begin
--执行部分 ——要执行的pl/sql语句和sql语句{必选}
[exception]
--异常处理部分 ——处理运行的各种错误
end;
基本数据类型
1.数值类型
NUMBER(总位数m,小数位数n) 整数或浮点数
PLS_INTEGER、BINARY_INTEGER 整数
2.字符类型
VARCHAR2(m) 最大长度m<32767
CHAR(m) 默认长度1,空格补全
LONG 最大2G
NCHAR、NCARCHAR2
3.日期类型
DATA 7字节(世纪、年、月、天、时、分、秒)
4.布尔类型
BOOLEAN
特殊数据类型
1.%TYPE类型
新变量 表名.列名%TYPE 声明新变量与表.列的类型相同
2.RECORD类型
类似于C语言中的结构数据类型。
TYPE 类型名 IS RECORD
(
成员变量1 数据类型1 [NOT NULL] [:= default_value ],
成员变量2 数据类型2 [NOT NULL] [:= default_value ],
......
成员变量n 数据类型n [NOT NULL] [:= default_value ]
);
定义变量 类型名;
3.%ROWTYPE类型
变量名 表名%ROWTYPE; 定义一个变量表示表中一行记录,一行记录的各个列与表中一行的各个列有相同的名称和数据类型。
*自定义对象类型
普通类型
:不包含任何方法的对象类型
object的字段就相当与表的字段。自定义的table类型需要用的已经定义好的object类型
create [or replace] type person_typ as object(
name VARCHAR2(10), --姓名
gender VARCHAR2(2), --性别
birthdate DATE, --生日
);
定义了类型之后,我们就可以将它当作普通的基本类型用了:建表,写function等。
例:建表,插数据
CREATE TABLE person_tab1 OF person_typ
INSERT INTO person_tab1 VALUES('玛丽','女','11-1月-76 '); --普通插入
INSERT INTO person_tab1 VALUES(person_typ1('王明','男','12-4月-76')); --使用对象类型的构造方法来插数据。
自定义构造方法的类型
:用于初始化对象并返回对象实例,作用类似JAVA的构造方法。
在建立对象类型时,Oracle会自动为对象类型生成相应的构造方法,并且构造方法用于初始化对象实例。
自定义构造函数时,构造方法的名称必须要与对象类型名称完全相同。必须要用CONSTRUCTOR FUNCTION关键字定义构造方法。
例:建立和使用对象person_typ,包含姓名,性别,出生日期及用于初始化对象实例的三个自定义构造方法。
CREATE OR REPLACE TYPE person_typ AS OBJECT(
name VARCHAR2(10), --姓名
gender VARCHAR2(2), --性别
birthdate DATE, --生日
--三个自定义构造函数
CONSTRUCTOR FUNCTION person_typ(name VARCHAR2)
RETURN SELF AS RESULT,
CONSTRUCTOR FUNCTION person_typ(name VARCHAR2,gender VARCHAR2)
RETURN SELF AS RESULT,
CONSTRUCTOR FUNCTION person_typ(name VARCHAR2,gender VARCHAR2,birthdate DATE)
RETURN SELF AS RESULT
);
CREATE OR REPLACE TYPE BODY person_typ IS
CONSTRUCTOR FUNCTION person_typ(name VARCHAR2)
RETURN SELF AS RESULT
IS
BEGIN
self.name:=name;
self.gender:='女';
self.birthdate:=SYSDATE;
return;
END;
CONSTRUCTOR FUNCTION person_typ6(name VARCHAR2,gener VARCHAR2)
RETURN SELF AS RESULT
IS
BEGIN
self.name:=name;
self.gender:=gender;
self.birthdate:=SYSDATE;
return;
END;
CONSTRUCTOR FUNCTIION person_typ6(name VARCHAR2,gender VARCHAR2,birthdate DATE)
RETURN SELF AS RESULT
IS
BEGIN
self.name:=name;
self.name:=gender;
self.birthdate:=birthdate;
return;
END;
END;
带成员方法的类型
:用于在对象类型中访问特定对象实例的数据
当使用MEMBER方法时,可以使用内置参数SELF访问当前对象实例。无论是否定义SELF参数,它都会被作为第一个参数传递给MEMBER方法。但如果要定义参数SELF,那么其类型必须要使用当前对象类型。
注意:MEMBER方法只能由对象实例调用,而不能由对象类型
调用类型包含了对类型中数据的内部处理,调用该类型时,可将处理后的数据返回给调用方。
例:
首先,在person_typ中增加一个成员方法声明:
CREATE OR REPLACE TYPE person_typ AS OBJECT(
name VARCHAR2(10),
gender VARCHAR2(2),
birthdate DATE,
address VARCHAR2(100),
MEMBER PROCEDURE change_address(new_addr VARCHAR2),
MEMBER FUNCTION get_info
RETURN VARCHAR2
);
然后,创建一个type body,在type body中实现该成员方法:
CREATE OR REPLACE TYPE BODY person_typ IS
MEMBER PROCEDURE change_address(new_addr VARCHAR2)
IS
BEGIN
address:=new_addr;
END;
MEMBER FUNCTION get_info
RETURN VARCHAR2
IS
v_info VARCHAR2(100);
BEGIN
v_info:='姓名'||name||'出生日期'||birthdate;
RETURN v_info;
END;
END;
带静态方法的类型
:在对象类型上执行全局操作
注意:STATIC方法只能由对象类型访问,而不能由对象实例访问
定义常量、变量
常量名 constant 数据类型 := 初始值;
变量名 数据类型(长度) := 初始值; --设置初始值
变量名 数据类型(长度); --不设置初始值,被赋值为NULL
流程控制
选择
IF 表达式1 THEN
PL/SQL语句1;
ELSIF 表达式2 THEN
PL/SQL语句2;
ELSE
PL/SQL语句3;
END IF;
CASE 选择器变量
WHEN 表达式1 THEN PL/SQL语句1;
WHEN 表达式2 THEN PL/SQL语句2;
···
[ELSE PL/SQL语句n;]
END CASE;
循环
LOOP
循环体;
EXIT WHEN 表达式
END LOOP;
WHLE 表达式 LOOP
循环体;
END LOOP;
FOR 计数器变量 IN [REVERSE] 下限..上限 LOOP
循环体;
END LOOP;
跳转
<<mark>>
······
GOTO mark;
游标(CURSOR)
显式游标
通常用于SELECT语句返回的结果集
1.声明
declare
cursor 游标名[(输入参数1,输入参数2···)]
[return 返回值类型]
is selsct语句;
2.打开
open 游标名[(输入参数1,···)];
3.读取
fetch 游标名 into {变量};
将游标当前行的数据保存到变量中,并指向下一行。 数据不存在时游标名%found值为false。
4.关闭
clouse 游标名;
隐式游标
主要是处理UPDATE、DELETE语句的执行结果
隐式游标默认名称:【SQL】
sql%found 布尔 是否影响到数据
sql%notfound 布尔 与%found相反
sql%rowcount 数字 受到影响的行数
sql%isopen 布尔 游标是否打开
游标变量
声明(返回类型是一个记录类型)
TYPE 类型名 IS REF CURSOR --定义使用的类型
RETURN 返回类型;
游标变量 类型名; --定义游标变量
打开
OPEN 游标变量 FOR select语句;
关闭
异常处理
预定义异常、用户定义异常
WHEN 异常类型|用户定义异常|异常代码|OTHERS THEN
异常处理语句;
可将PL/SQL程序块独立编译并存储为:存储过程、函数、触发器和程序包。以便以后调用或引用它
存储过程(PROCEDURE)
命名的PL/SQL块,通过execute命令直接执行 或 在PL/SQL块内用名称调用。
创建储存过程
create [or replace] procedure 存储过程名称
[(定义in out参数1,参数2,···)] is|as
[定义内部变量;]
begin
PL/SQL语句;
[exception]
[异常处理语句;]
end [存储过程名称];
--注:定义in out参数格式【参数名 IN|OUT 数据类型(不能指定长度) [default'in参数默认值']】
执行存储过程
1.EXEC命令执行
execute|exec 存储过程名称;
2.PL/SQL块中调用
call在pl/sql与sqlplus中都可以使用,execute只能在sqlplus中使用。
参数
IN模式参数:
由调用者传入,可在声明时初始化默认值,在没有传入参数时使用默认值
1.指定名称传递
存储过程名称(参数名称1=>参数值1,···);
2.按位置传递
存储过程名称(参数值1,参数值2,···);
3.混合方式传递
OUT模式参数:
out参数值可以传到存储过程以外。
1.PL/SQL块中调用时:需要在declare部分定义与out参数兼容的变量;
2.EXEC命令执行时:需要使用variable声明变量存储out的返回值;
IN OUT模式参数:
既可以从外界传入值,又可以将返回值传给外界。
函数(FUNCTION)
调用函数要用表达式,必须有一个返回值。
创建函数:
create [or replace] function 函数名称
[(函数参数1,参数2,···)]return 返回的数据类型 is
[定义函数内部变量;]
begin
PL/SQL语句; --必须用return语句返回函数值!
[exception]
[异常处理语句;]
end [函数名称];
调用函数:
必须使用一个变量来保存函数的返回值
变量 :=函数名称(参数1···);
触发器
特殊的存储过程,通过“触发事件”来执行
create [or replace] tigger 触发器名
[触发时间before|after|instead of] 触发事件
on 数据表|视图|用户模式|数据库
[for each row[when 触发条件表达式]] --指定为行级触发器
begin
pl/sql语句;
end;
触发事件5种类型:
1.语句级(insert,update,delete)【仅执行一次】
2.行级【通过for each row指定为行级触发器,每对一行操作时触发一次】,主键自增
3.替换,4.用户事件,5.系统事件
序列
create sequence 序列名称
[increment by n] --序列增量n:如果n是正数就递增,如果是负数就递减 默认是1
[start with n] --序列起始值,递增默认是minvalue 递减是maxvalue
[MAXVALUE n | NOMAXVALUE] --序列的最大值
[MINVALUE n | NOMINVALUE] --序列的最小值
[cachen | nocache] --是否预分配序列并存入到内存中
[cycle | nocycle] --达到最值时:循环/不循环
[order | noorder]; --保证按顺序产生|只保证唯一
程序包(PACKAGE)
程序包里面可以包含存储过程,函数,变量,游标等PL/SQL程序。类似java的jar包
例:dbms_output是程序包,put_line是其中的一个存储过程。
set serveroutput on --用来使dbms_output生效(默认即打开)
dbms_output.put_line('输出显示信息');
程序包由包规范和包主体组成。
规范
在包主体之前创建
create [or replace] package 程序包名称 is
[规范内声明的变量];
[声明的类型];
[定义的游标];
[声明的函数];--不包括函数体
[声明的存储过程];--不包括存储过程主体
end;
主体
create [or replace] package body 程序包名称 is
[内部变量]
[游标主体]
[引入“规范”中函数头部声明]
{begin
函数主体plsql语句;
[exception]
[异常处理语句;]
end [函数名称];}
[引入“规范”中存储过程头部声明]
{begin
存储过程主体plsql语句;
[exception]
[异常处理语句;]
end [存储过程名称];}
···
end [程序包名称];