Oracle | PL/SQL编程

PL/SQL(Procedural Language/SQL,过程化SQL语言),是一种高级数据库程序设计语言,专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。

PL/SQL 中可引用的SQL语句

  • 可用DML语句:SELECT INTO,INSERT,UPDATE,DELETE。
  • 可用TCL语句:COMMIT,ROLLBACK,SAVEPOINT。
  • 不能使用DDL语句。

PL/SQL 块

PL/SQL块:声明部分+执行部分+异常处理部分

-- 单行注释
DECLARE
    /* 声明部分:声明变量,类型、游标、局部存储过程和函数 */
BEGIN
    /* 执行部分:执行过程和SQL语句 */
[EXCEPTION]
    /* 异常处理部分 */
END;

PL/SQL 变量

PL/SQL 变量命名

标识符 命名规则
程序变量 V_name
程序常量 C_Name
游标变量 Name_cursor
异常标识 E_name
表类型 Name_table_type
Name_table
记录类型 Name_record

PL/SQL 变量类型

基本数据类型

number,char,varchar2,long,date

记录类型

记录类型:把逻辑相关的数据作为一个单元存储起来,用于存放互不相同但逻辑相关的信息。

TYPE record_type IS RECORD(
   Field1 type1  [NOT NULL]  [:= exp1 ],
   Field2 type2  [NOT NULL]  [:= exp2 ],
   . . .   . . .
   Fieldn typen  [NOT NULL]  [:= expn ] ) ;

%TYPE 类型

%TYPE类型:指某个已定义变量的数据类型类型,或数据表中某列的数据类型。

使用%TYPE特性的优点:

  • 所引用的数据库列的数据类型可以不必知道;
  • 所引用的数据库列的数据类型可以实时改变。

%RowType 类型

%RowType类型:返回一个与数据库表的数据结构一致的记录类型。

使用%ROWTYPE特性的优点:

  • 所引用的数据库中列的个数和数据类型可以不必知道;
  • 所引用的数据库中列的个数和数据类型可以实时改变。

PL/SQL 特殊运算符

赋值运算符::=

关系运算符:=>

上下限运算符:..

PL/SQL 流程控制

条件语句

IF 语句

IF <条件语句1> THEN
    语句1;
ELSIF <条件语句2> THEN
    语句2;
ELSE
    语句3;
END IF;

注意是ELSIF不是ELSEIF

CASE 语句

CASE <变量>
    WHEN <值1> THEN <结果1>
    WHEN <值2> THEN <结果1>
    ...
    WHEN <值N> THEN <结果N>
    [ELSE <结果N+1>]
END;

循环语句

do...while 循环

LOOP
    循环语句;
    EXIT WHEN <条件语句>
END LOOP;

while 循环

WHILE <条件语句> LOOP
    循环语句;
END LOOP;

for 循环

FOR <循环计数器> IN [REVERSE] <下限> .. <上限> LOOP
  循环语句;
END LOOP;

GOTO 语句

定义标号:<<标号名>>

GOTO语句:GOTO 标号名

NULL 语句

NULL语句:不做任何事,增强代码可读性。

PL/SQL 异常处理

异常错误类型

  • 预定义错误:无需在程序中定义,由Oracle自动将其引发。
  • 非预定义错误:用户需在程序中定义,然后由Oracle自动将其引发。
  • 用户定义错误:用户在程序中定义,然后显式地在程序中将其引发。

异常处理

EXCEPTION
   WHEN <异常1> THEN  <异常处理代码>
   WHEN <异常2> THEN  <异常处理代码>
   WHEN OTHERS THEN  <异常处理代码>

游标-CURSOR

为了处理 SQL 语句,Oracle 会分配一片叫上下文 (context area) 的区域来处理所必需的信息,即系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。游标就是一个指向上下文的句柄或指针。

显式游标

显式游标主要是用于对查询语句的处理,尤其是查询结果为多条记录的情况。

显式游标处理

①定义游标:定义游标名及对应的 SELECT 查询

CURSOR cursor_name (参数1 参数类型,参数2 参数类型...) IS
SELECT查询块;

数据类型不能使用长度约束。

②打开游标:执行游标的 SELECT 查询,将查询结果放入缓冲区,并指向缓冲区首部。

OPEN cursor_name (参数1 => 值,参数2 => 值...);

③提取游标数据:检索结果集中的数据行,放入指定输出变量中。

FETCH cursor_name INTO {variable_list | record_variable };

④关闭游标:释放游标占用的系统资源。

CLOSE cursor_name;

显式游标属性

游标属性 描述
%FOUND 布尔型,当最近一次读记录时成功返回,则值为TRUE
%NOTFOUND 布尔型,当最近一次读记录时返回失败,则值为TRUE
%ISOPEN 布尔型,当游标已打开时返回 TRUE
%ROWCOUNT 数值型,返回已从游标中读取的记录数

游标的FOR循环:

FOR 索引 IN 游标[值1,值2...] LOOP
    循环语句;
END LOOP;

隐式游标

隐式游标主要用于数据更新操作。隐式游标的名字为SQL,由Oracle系统提供,无需用户处理。

隐式游标属性

游标属性 描述
SQL%FOUND 布尔型,当最近一次读记录时成功返回,则值为TRUE
SQL%NOTFOUND 布尔型,当最近一次读记录时返回失败,则值为TRUE
SQL%ISOPEN 布尔型,当游标已打开时返回 TRUE
SQL%ROWCOUNT 数值型,返回已从游标中读取的记录数

存储过程与函数

存储过程用于执行特定操作,无返回值;函数用于执行复杂操作,有返回值;存储函数与函数统称为PL/SQL子程序。

存储过程-PROCEDURE

存储过程:执行特定操作,无返回值,多用于更新操作。

定义存储过程

CREATE [OR REPLACE] PROCEDURE Procedure_name
[ (argment [ { IN | IN OUT }] Type,
      argment [ { IN | OUT | IN OUT } ] Type ]
{ IS | AS }
<类型.变量的说明>
BEGIN
    <执行部分>
EXCEPTION
    <异常处理>
END;

函数-FUNCTION

函数:执行复杂操作,有返回值。

定义函数

CREATE [OR REPLACE] FUNCTION <函数名>[(argument [ { IN | IN OUT }] type,argument [ { IN | OUT | IN OUT } ] type]RETURN <返回值类型>
{ IS | AS }
    <类型.变量的说明>
BEGIN
    <执行部分>
EXCEPTION
    <异常处理>
END;

函数执行方式

dbms_output.put_line(fun());
select fun() from dual;

函数参数类型

  • 输入参数 IN
  • 输出参数 OUT
  • 输入输出参数 IN OUT

参数传递类型

位置表示法:根据参数位置依此传值

argument_value1[,argument_value2 …]

名称表示法:使用关系运算符=>为参数传值

argument => parameter [,…]

触发器-TRIGGER

触发器:用户定义的一类由事件触发而执行的特殊过程。

定义触发器

CREATE [OR REPLACE] TRIGGER <触发器名称>
{BEFORE | AFTER | INSTEAD OF}
{INSERT | DELETE | UPDATE [OF column [, column …]]}
ON <表/视图>
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW | STATEMENT]
[WHEN condition]
trigger_body;

触发事件:INSERT | DELETE | UPDATE

触发时机:BEFORE | AFTER

触发频率:

  • ROW:行级触发;当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
  • STATEMENT:语句级触发;当某触发事件发生时,该触发器只执行一次。

触发器的新值与旧值:

  • :new 事件触发后的新的数据行;
  • :old 事件触发前的旧的数据行;

原文地址:https://www.cnblogs.com/liziczh/p/9353051.html

时间: 2024-10-09 20:45:11

Oracle | PL/SQL编程的相关文章

ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE PL/SQL编程之八:把触发器说透 得到了大家的强力支持,感谢.接下来再下猛药,介绍下一篇,大家一定要支持与推荐呀~!我也才有动力写后面的.   本篇主要内容如下: 6.1 引言 6.2 创建函数 6.3 存储过程 6.3.1 创建过程 6.3.2 调用存储过程 6.3.3 AUTHID 6.3.4 

[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)                [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]

[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) 得到了大家的强力支持与建议,万分感谢.接下来介绍下一篇:oracle pl/sql异常处理部分,还望大家一定

【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人品牌. 本是成书的,但后来做其他事了,就无偿的贡献出来,被读者夸其目前为止最“实在.经典”的写ORACLE PL/SQL编程的文章-! 觉得对你有帮助,请留言与猛点推荐,谢谢. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) 本篇主要内容如下:第一章 PL/S

[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) 得到了大家的强力支持,感谢.接下来再下猛药,介绍下一篇,大家一定要支持与推荐呀~!我也才有动力写后面的. 本篇主要内容如下: 4.1 游标概念 4.1.1 处理显式游标 4.1.2 处理

[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ——通过知识共享树立个人品牌. 继上五篇: [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不

[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下) ——通过知识共享树立个人品牌. 继上六篇: [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程之四:把游标说透(

[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天才在于积累!) ——通过知识共享树立个人品牌.   继上七篇:            [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)            [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之

ORACLE PL/SQL编程之八(一): 把触发器说透

本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INSTEAD OF)触发器 8.2.3 创建系统事件触发器 8.2.4 系统触发器事件属性 8.2.5 使用触发器谓词 8.2.6 重新编译触发器 8.3 删除和使能触发器 8.4 触发器和数据字典 8.5   数据库触发器的应用举例 触发器是许多关系数据库系统都提供的一项技术.在O

ORACLE PL/SQL编程之八(二): 把触发器说透

例2:创建DML语句行级触发器.当对emp表执行INSERT, UPDATE, DELETE 操作时,它自动更新dept_summary 表中的数据.由于在PL/SQL块中不能直接调用DDL语句,所以,利用ORACLE内置包DBMS_UTILITY中的EXEC_DDL_STATEMENT过程,由它执行DDL语句创建触发器. BEGIN  DBMS_OUTPUT.PUT_LINE('插入前');  Disp_dept_summary();  DBMS_UTILITY.EXEC_DDL_STATEM