PL/SQL 是一种块结构语言,它使开发人员能够将 SQL 的强大功能与过程语句结合起来。一个块的所有语句都一次性传递给 oracle 引擎,从而提高了处理速度并减少了流量。
SQL的缺点:
- SQL 没有为程序员提供条件检查、循环和分支技术。
- SQL 语句一次传递到 Oracle 引擎一个,这会增加流量并降低速度。
- SQL 在操作数据期间没有错误检查功能。
PL/SQL 的特点:
- PL/SQL 基本上是一种过程语言,它提供决策、迭代和过程编程语言的更多特性的功能。
- PL/SQL 可以使用单个命令在一个块中执行多个查询。
- 可以创建一个 PL/SQL 单元,例如过程、函数、包、触发器和类型,这些单元存储在数据库中以供应用程序重用。
- PL/SQL 提供了一个特性来处理发生在 PL/SQL 块中的异常,称为异常处理块。
- 用 PL/SQL 编写的应用程序可移植到运行 Oracle 的计算机硬件或操作系统。
- PL/SQL 提供广泛的错误检查。
SQL 和 PL/SQL 的区别:
SQL | PL/SQL |
SQL is a single query that is used to perform DML and DDL operations. | PL/SQL is a block of codes that used to write the entire program blocks/ procedure/ function, etc. |
It is declarative, that defines what needs to be done, rather than how things need to be done. | PL/SQL is procedural that defines how the things needs to be done. |
Execute as a single statement. | Execute as a whole block. |
Mainly used to manipulate data. | Mainly used to create an application. |
Cannot contain PL/SQL code in it. | It is an extension of SQL, so it can contain SQL inside it. |
PL/SQL 块的结构:
PL/SQL 通过添加过程语言中的结构来扩展 SQL,从而产生比 SQL 更强大的结构化语言。 PL/SQL 中的基本单位是块。所有 PL/SQL 程序都由块组成,这些块可以相互嵌套。
通常,每个块在程序中执行一个逻辑操作。一个块具有以下结构:
DECLARE
declaration statements;
BEGIN
executable statements
EXCEPTIONS
exception handling statements
END;
- 声明部分以DECLARE关键字开头,其中可以声明变量、常量、记录作为游标,临时存储数据。它基本上由 PL/SQL 标识符的定义组成。这部分代码是可选的。
- 执行部分以BEGIN开始,以END关键字结束。这是一个强制性部分,在这里编写程序逻辑来执行任何任务,如循环和条件语句。它还支持所有 DML 命令、DDL 命令和 SQL*PLUS 内置函数。
- 异常部分以EXCEPTION关键字开头。此部分是可选的,其中包含发生运行时错误时执行的语句。任何异常都可以在本节中处理。
PL/SQL 标识符
有几个 PL/SQL 标识符,例如变量、常量、过程、游标、触发器等。
-
变量:
与其他几种编程语言一样,PL/SQL 中的变量必须在使用前声明。它们也应该具有有效的名称和数据类型。变量声明的语法:
variable_name datatype [NOT NULL := value ];
显示如何在 PL/SQL 中声明变量的示例:
SQL> SET SERVEROUTPUT ON; SQL> DECLARE var1 INTEGER; var2 REAL; var3 varchar2(20) ; BEGIN null; END; /
输出:
PL/SQL procedure successfully completed.
解释:
- SET SERVEROUTPUT ON :用于显示 dbms_output 使用的缓冲区。
- var1 INTEGER :它是变量的声明,名为var1的整数类型。还有许多其他数据类型可以使用,如 float、int、real、smallint、long 等。 它还支持 SQL 中使用的变量以及 NUMBER(prec, scale)、varchar、varchar2 等。
- PL/SQL 过程成功完成。 :代码编译执行成功时显示。
- END 后的斜线 (/); : 斜线 (/) 告诉 SQL*Plus 执行块。
1.1) 初始化变量:
变量也可以像在其他编程语言中一样初始化。让我们看一个相同的例子:SQL> SET SERVEROUTPUT ON; SQL> DECLARE var1 INTEGER := 2 ; var3 varchar2(20) := 'I Love GeeksForGeeks' ; BEGIN null; END; /
输出:
PL/SQL procedure successfully completed.
解释:
- 赋值运算符(:=) :用于为变量赋值。
-
显示输出:
使用 DBMS_OUTPUT 显示输出,DBMS_OUTPUT 是一个内置包,使用户能够显示输出、调试信息以及从 PL/SQL 块、子程序、包和触发器发送消息。让我们看一个例子,看看如何使用 PL/SQL 显示消息:
SQL> SET SERVEROUTPUT ON; SQL> DECLARE var varchar2(40) := 'I love GeeksForGeeks' ; BEGIN dbms_output.put_line(var); END; /
输出:
I love GeeksForGeeks PL/SQL procedure successfully completed.
解释:
- dbms_output.put_line :此命令用于将 PL/SQL 输出定向到屏幕。
-
使用评论:
像在许多其他编程语言中一样,在 PL/SQL 中,也可以在代码中放置对代码没有影响的注释。在 PL/SQL 中有两种创建注释的语法:- 单行注释:要创建单行注释,使用符号– – 。
- 多行注释:要创建跨越多行的注释,使用符号/*和*/ 。
显示如何在 PL/SQL 中创建注释的示例:
SQL> SET SERVEROUTPUT ON; SQL> DECLARE -- I am a comment, so i will be ignored. var varchar2(40) := 'I love GeeksForGeeks' ; BEGIN dbms_output.put_line(var); END; /
输出:
I love GeeksForGeeks PL/SQL procedure successfully completed.
-
从用户获取输入:
就像在其他编程语言中一样,在 PL/SQL 中也是如此,我们可以从用户那里获取输入并将其存储在一个变量中。让我们看一个例子来展示如何在 PL/SQL 中从用户那里获取输入:SQL> SET SERVEROUTPUT ON; SQL> DECLARE -- taking input for variable a a number := &a; -- taking input for variable b b varchar2(30) := &b; BEGIN null; END; /
输出:
Enter value for a: 24 old 2: a number := &a; new 2: a number := 24; Enter value for b: 'GeeksForGeeks' old 3: b varchar2(30) := &b; new 3: b varchar2(30) := 'GeeksForGeeks'; PL/SQL procedure successfully completed.
- (***)让我们看一个关于 PL/SQL 的示例,以在一个代码块中演示上述所有概念。
--PL/SQL code to print sum of two numbers taken from the user. SQL> SET SERVEROUTPUT ON; SQL> DECLARE -- taking input for variable a a integer := &a ; -- taking input for variable b b integer := &b ; c integer ; BEGIN c := a + b ; dbms_output.put_line('Sum of '||a||' and '||b||' is = '||c); END; /
Enter value for a: 2 Enter value for b: 3 Sum of 2 and 3 is = 5 PL/SQL procedure successfully completed.
PL/SQL 执行环境:
PL/SQL 引擎驻留在 Oracle 引擎中。Oracle 引擎不仅可以处理单个 SQL 语句,还可以处理多个语句块。如果这些 SQL 语句执行任意数量的 SQL 语句,只需调用一次 Oracle 引擎即可捆绑在 PL/SQL 块中。