📜  PL/SQL 介绍

📅  最后修改于: 2021-09-08 15:39:50             🧑  作者: Mango

PL/SQL 是一种块结构语言,它使开发人员能够将 SQL 的强大功能与过程语句结合起来。一个块的所有语句都一次性传递给 oracle 引擎,从而提高了处理速度并减少了流量。

SQL的缺点:

  • SQL 没有为程序员提供条件检查、循环和分支技术。
  • SQL 语句一次传递到 Oracle 引擎一个,这会增加流量并降低速度。
  • SQL 在操作数据期间没有错误检查功能。

PL/SQL 的特点:

  1. PL/SQL 基本上是一种过程语言,它提供决策、迭代和过程编程语言的更多特性的功能。
  2. PL/SQL 可以使用单个命令在一个块中执行多个查询。
  3. 可以创建一个 PL/SQL 单元,例如过程、函数、包、触发器和类型,这些单元存储在数据库中以供应用程序重用。
  4. PL/SQL 提供了一个特性来处理发生在 PL/SQL 块中的异常,称为异常处理块。
  5. 用 PL/SQL 编写的应用程序可移植到运行 Oracle 的计算机硬件或操作系统。
  6. 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 标识符,例如变量、常量、过程、游标、触发器等。

  1. 变量
    与其他几种编程语言一样,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.
    

    解释:

    • 赋值运算符(:=) :用于为变量赋值。
  2. 显示输出
    使用 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 输出定向到屏幕。
  3. 使用评论
    像在许多其他编程语言中一样,在 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.
    
  4. 从用户获取输入
    就像在其他编程语言中一样,在 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.
    
  5. (***)让我们看一个关于 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 块中。