PL/SQL

{}必选    []可选

目录

PL/SQL块结构

基本数据类型

特殊数据类型 

*自定义对象类型

普通类型

自定义构造方法的类型

带成员方法的类型

带静态方法的类型

定义常量、变量

流程控制

游标(CURSOR)

显式游标

隐式游标

游标变量

异常处理

存储过程(PROCEDURE)

参数

函数(FUNCTION)

触发器

序列

程序包(PACKAGE)

规范

主体


PL/SQL块结构

 

[declare]
--定义部分    ——定义常量、变量、游标、例外、复杂数据类型
begin 
--执行部分    ——要执行的pl/sql语句和sql语句{必选}
[exception]
--异常处理部分    ——处理运行的各种错误
end; 

基本数据类型

1.数值类型

NUMBER(总位数m,小数位数n)     整数或浮点数

PLS_INTEGERBINARY_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 [程序包名称];

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xyc1211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值