PL/SQL简介
Posted 一只特立独行的_小猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PL/SQL简介相关的知识,希望对你有一定的参考价值。
目录
PL/SQL简介
PL/SQL(Procedure Language/SQL)程序语言是 Oracle 对 SQL 语言的过程化扩展,指在 SQL 命令语言中增加了过程处理语句(如:分支、循环等),使 SQL 命令语言具有过程处理能力。把 SQL 语言的数据操纵能力与过程语言的数据处理能力结合起来,使得 PL/SQL 面向过程但比过程语言简单、高效、灵活和实用。其基本语法结构为PL/SQL块。
PL/SQL块
在 PL/SQL 中,最小的有意义的代码分组被称为块。块代码为变量声明和异常处理提供执行和作用域边界。PL/SQL 允许您创建匿名块和命名块。命名块可以是包、过程、函数、触发器或对象类型。PL/SQL 是 SQL 的过程语言扩展,它具有块结构。每一段代码都在块中执行。
1、语法
PL/SQL有四个关键字:
- DECLARE:PL/SQL块的声明部分。
这是为游标、数据类型定义、变量、嵌入函数和过程分配内存的位置。
- BEGIN:PL/SQL块的可执行部分。
它以关键字BEGIN开头。BEGIN标志着你把程序逻辑放在哪里的开始。并且每个PL/SQL程序必须至少有一行可执行代码,即使它是关键字NULL,这意味着没有操作。
- EXCEPTION:PL/SQL块的异常处理部分。
它以关键字EXCEPTION开头。这是您将捕获任何数据库或PL/SQL错误的地方。
- END:每个PL / SQL块以关键字END结束。
2、匿名块
- 匿名块不保存在数据库中。它们非常适合创建测试单元。匿名PL/SQL块的一般语法如下:
[ DECLARE ... declaration statements ... ]
BEGIN ... one or more executable statements ...
[ EXCEPTION
... exception handler statements ... ]
END;
其中, 方括号表示语法的可选部分。您必须具有BEGIN和END语句,并且必须至少有一个可执行语句。
-- This is an anonymous procedure, so it has no name
declare
/*
declare local cursors, variables, and methods here.
We don't need to have a declaration section.
*/
begin
-- You write your logic here
null; -- at least one command!
exception
when NO_DATA_FOUND then
raise_application_error(-20000, 'No Data Found!');
end;
/ -- the forward slash says execute this procedure
- 最小的匿名块:
-- 告诉SQL * Plus在PL / SQL过程完成后,将您的会话的数据库输出回显到屏幕。注意,这是一个SQL * Plus命令,不是匿名块的一部分。
SET SERVEROUTPUT ON SIZE 1000000
BEGIN
DBMS_OUTPUT.PUT_LINE(SYSDATE);
END;
/
PL/SQL语法简介(匿名PL/SQL块)
PL/SQL
- PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言。
- SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环)。而PL/SQL是结构化的和过程化的结合体,而且最为重要的是,在用户执行多条SQL语句时,每条SQL语句都是逐一的发送给数据库,而PL/SQL可以一次性将多条SQL语句一起发送给数据库,减少网络流量
SQL执行 |
PL/SQL执行 |
|
- 匿名Pl/SQL块
- – 动态构造,只能执行一次
- 一次性完成,没有名字
- 存储过程,函数,触发器
- 给它一个名字,保存到数据库,可以反复使用,调用.
- – 存储在数据库中编译过的代码,可以反复执行。
PL/SQL语法结构
语法:
DECLARE -- 声明部分,例如:定义变量、常量、游标。 BEGIN -- 程序编写、SQL语句 EXECTPION -- 处理异常 END ; / |
说明:
声明部分(DECLARE) |
包含变量定义、用户定义的PL/SQL类型、游标、引用的函数或过程; |
执行部分(BEGIN) |
包含变量赋值、对象初始化、条件结构、迭代结构、嵌套的PL/SQL匿名块,或是对局部或存储PL/SQL命名块的调用; |
异常部分(EXCEPTION) |
包含错误处理语句,该语句可以像执行部分一样使用所有项; |
结束部分(END) |
程序执行到END表示结束,分号用于结束匿名块,而正斜杠(/)执行块程序; |
默认情况下系统输出显示被关闭的,需要设定 SET SERVEROUTPUT ON
匿名Pl/SQL块
– 动态构造,只能执行一次
一次性完成,没有名字
范例
编写不做任何工作的PL/SQL块 |
BEGIN NULL ; END ; / |
最简单的循环PL/SQL匿名块,null表示什么也没干 |
BEGIN for i in 1..10 loop null; end loop; END; / |
编写HELLO WORD |
SQL> BEGIN 2 DBMS_OUTPUT.put_line(\'HELLO,WENDY\'); 3 END; 4 / HELLO,WENDY
PL/SQL procedure successfully completed. |
匿名PL/SQL块,循环显示2遍HELLOW,WENDY |
BEGIN For I in 1..2 loop DBMS_OUTPUT.put_line(\'HELLO,WENDY\'); End loop; END; / |
匿名PL/SQL块,循环插入数据 SQL> insert into t select rownum,\'x\' from dba_objects where rownum<101; 能用SQL解决的就不要用PL/SQL PL/SQL会消耗资源,效率很低 |
BEGIN for i in 1..100 loop insert into t values(i,\'w\'); end loop; END; / |
编写一个简单的PL/SQL程序 := 为变量赋值 |
DECLARE v_num NUMBER ; -- 定义一个变量v_num BEGIN v_num := 30 ; -- 设置v_num的内容 DBMS_OUTPUT.put_line(\'V_NUM变量的内容是:\' || v_num) ; END ; / |
编写PL/SQL块,输入一个雇员编号,而后取得指定的雇员姓名 |
DECLARE v_eno NUMBER ; v_ename VARCHAR2(10) ; BEGIN v_eno := &empno ; -- 由键盘输入雇员编号 SELECT ename INTO v_ename FROM emp WHERE empno=v_eno ; DBMS_OUTPUT.put_line(\'编号为:\' || v_eno || \'雇员的名字为:\'|| v_ename) ; END ; / |
以上是关于PL/SQL简介的主要内容,如果未能解决你的问题,请参考以下文章
windows64位Oracle Database 12c Release 2安装和PL/SQL Developer配置