oracle数据库--PL/SQL

1、PL/SQL介绍

PL/SQL:oracle对SQL的扩展,是一种模块化、过程化语言,属于第三代语言(3G)。
PL/SQL引擎:PL/SQL编译和运行系统,处于PL/SQL单元(块、函数、包、过程、触发器等)。过程化执行器处理过程化语句;SQL执行器处理SQL语句。

1)PL/SQL块(基本单元)

[delare] --声明部分
--declaration statements
begin --开始
--executable statements
[exception] --异常处理
--exception statements
end --结束

注:块可以嵌套,分为匿名块(未命名的PL/SQL单元,不可被调用)和命名块(被编译好并存储于数据库中,包括存储过程、函数、包等),PL/SQL子程序就是命名的PL/SQL块,一般特质函数和存储过程。

 

2)变量和常量

变量声明:varuable_name datatype [not null] [:=|default expression] (变量的作用范围:在一个块中定义的变量,在该块的子块中也有效)
常量声明:varuable_name constant datatype [not null] [:=|default expression]

 

3)绑定变量:在SQL*Plus中创建和使用的变量,目的是重复利用SQL语句,可以被SQL*Plus识别,可以用在PL/SQL和SQL中使用。

创建绑定变量:variable bd varchar2(100);
引用绑定变量::bd:=‘hello!‘ --赋值,引用格式是冒号后面紧跟绑定变量的名称


4)PL/SQL的数据类型与数据库的数据类型有差异。PL/SQL数据类型分为:

4.1)预定义PL/SQL数据类型:

  • 标量类型(Scalar):标准的数据类型,没有内部组件 --char、varchar2、number、raw、boolean、date等
  • 集合类型(Composite):包含能够被独立操作的内部组件 --嵌套表nested table、可变数组varray、表table、记录record
  • 指针类型(Reference):类似于3G语言中的指针 --游标类型
  • LOB类型(Large Object):LOB类型的值就是LOB定位器 --bfile、blob、clob、nclob

4.2)用户自定义PL/SQL子类型:其他数据类型的子集

定义格式:subtype 子类型名 is 基本数据类型[constraint][not null];

 

5)NULL:既可以表示空值也可以表示空语句

v2:=null;
null;

 

6)数据类型转换

6.1)隐式转换:有PL/SQL自动完成,作为赋值,oracle可以自动转换如下:

      

6.2)显示转换:利用函数来转换,如:to_char(sysdate,‘YYYY-MM-DD:HH24:MI:SS‘)

 

7)在PL/SQL中可以使用如下DML:

declare
x varchar2(20) := ‘xxxx‘;
y varchar2(20) := ‘yyyyyyyy‘;
begin
insert into testtable values (x,y) --往表中插入数据
update testtable set name = x where address = y; --更新
delete from testtable where name = x; --删除数据
commit; --也可以使用rollback
end;

    在PL/SQL中使用查询,必须把查询结果赋值给变量,使用into子句将结果赋值给变量。

 

8)控制结构

8.1)条件结构

if 条件1 then
语句
...
elsif 条件2
语句
...
else
语句
...
end if


8.2)循环结构

--基本循环:
loop
语句
...
end loop;

--for循环:
for counter in [reverse] 开始值...结束值 loop --counter每次加1,默认从开始到结束,reverse表示从结束到开始
语句
...
end loop

--while循环:
while "条件" loop
语句
...
end loop

循环退出:

无条件退出:exit
有条件退出:exit when y > 3;

循环继续:

无条件继续:continue
有条件继续:continue when y > 3;

 

9)goto

begin
<<pb2>> --标签
...
goto pb2;
end;


10)异常

oralce预定义的异常:
      

块中异常处理的定义:

begin
...
exception
when 异常1 then
对异常1进行处理
when 异常2 then
对异常2进行处理
...
when others then
...
end;

捕捉异常:

begin
...
exception
when others then
dbms_output.put_line(‘error code:‘||sqlcode||‘ ‘||sqlerrm); --sqlcode返回错误代码,sqlerrm返回错误信息,都是oracle预定义函数
end;

自定义异常:

"异常的名字" exception;

给异常指定错误编号:

pragma exception_init(exception_name,-oracle_error_number); --20000~20999

异常的触发方式:

  • 由oracle自动触发
  • raise语句手工触发:raise myecp;
  • 调用存储过程raise_application_error手工触发:raise_application_error(-20009,‘data is out of list‘);

异常的传递:

    当一个子块的异常发生时,如果子块中没有异常处理,该异常将传递到父块中,并满足条件时一致往上传递。

 

2、游标

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。