PL/SQL 初探

Hello PL/SQL

Posted by mingfer on September 19, 2019

PL/SQL 是一种功能强大而且简单易用的数据库编程语言。它易于编写和阅读,并且包含许多开箱即用的特性和安全功能。

PL/SQL 是什么?

在我们应用程序的技术架构中,我们总能找到数据库的存在,从而使得我们的应用程序能够存储和操作大量的数据。而操纵其中关系型数据库内容的 SQL 语言是一种非常强大的面向集合的语言。在我们使用关系型数据库构建的应用程序中,我们必须依靠执行 SQL 语句从数据库中检索数据或向数据库添加数据。但是 SQL 语句无法实现应用程序中所需要的业务逻辑和用户功能,这恰好就是 PL/SQL 存在的意义。

PL/SQL 是一种可以在其语法中使用 SQL 语句的过程语言。PL/SQL 程序由 Oracle 数据库服务器进行编译并存储在该数据库中。在运行时,PL/SQL 和 SQL 在同一服务进程中运行,从而带来最佳效率。PL/SQL 自动继承 Oracle 数据库的健壮性,安全性和可移植性。

PL/SQL 是一种块结构的编程语言。PL/SQL 提供了一组过程控制的语句,如条件判断,循环,赋值;提供是实现独特功能的函数块;这些功能对 SQL 语言做了一定的扩展和补充。

在不使用 PL/SQL 的情况下,我们可以选择在应用程序中执行 SQL 语句实现具体的业务逻辑。但是使用 PL/SQL 执行特定于数据库的操作,尤其是执行 SQL 语句,会带来非常明显的优点:包括和 SQL 紧密集成,减少了网络流量,提高了可移植性(可运行在任意的 Oracle 数据库实例)。

编辑工具

本文使用的 IDE 工具为 Oracle 官方免费提供的 Oracle SQL Developer ,该工具下载之后解压到对应的目录,通过 sqldeveloper.exe 启动。土豪玩家也可以使用 PL/SQL Developer 。

先对 Oracle SQL Developer 做简单的配置:

  1. 点击图标进入数据库添加页面。 1568950184432

  2. 按照下图填写数据库的用户密码以及 IP 端口信息。填写完毕之后,注意使用测试按钮测试一下数据库的联通性,然后再连接数据。

    1568950505525

  3. 下面是数据库中比较重要的几个目录:数据库表(Tables),编写的过程或函数的程序包(Packages),PL/SQL 过程(Procedures),PL/SQL 函数(Functions),导入的 Java 代码(Java)。

    1568950711856

也可以选择 Oracle 提供的线上数据库:https://livesql.oracle.com 实验我们需要执行的 SQL 或 PL/SQL 脚本。

Hello World

过程 PROCEDURE

下面是一个打印 Hello World 的存储函数:

create or replace PROCEDURE HELLOWORLD 
AS
BEGIN
  dbms_output.put_line('Hello World!');
END HELLOWORLD;

在 Oracle SQL Developer 中编辑和执行该过程:

  1. 在过程下面新建一个 helloworld 的过程。

    1568957661725

  2. 输入过程名称,如果需要添加为过程添加输入参数和输出参数可以点击【参数】右边的【+】进行添加。

    1568957997724

  3. 编写我们的过程代码,并点击三角符号运行我们的过程。

    1568958080523

  4. 编写调用过程的代码,执行过程。

    1568958202692

在 livesql 上,可以在 SQL Worksheet 编辑和执行 PL/SQL 代码:

1568958422186

函数 FUNCTIONS

函数和过程在代码形式上是非常类似的,它们的区别在于:

  • 函数一定要有返回值,过程没有返回值
  • 函数可以直接在 sql 语句中使用,过程必须单独调用
  • 过程能够的实现的功能,函数能够实现
  • 函数能实现的功能,过程也能够实现
  • 函数存在意义是给过程调用,在工作中通常调用的是过程

下面是一个打印 Hello World 的函数:

create or replace FUNCTION FUNCTION_HELLOWORLD RETURN VARCHAR2 
AS 
BEGIN
  RETURN 'Hello World';
END FUNCTION_HELLOWORLD;

在 Oracle SQL Developer 中编辑和执行函数的流程和执行过程是一样的,区别在于函数在下图所示的目录下创建:

1568959109021

程序包 PACKAGES

Package 存在的意义是将在逻辑上或物理上有关联的 PL/SQL 代码块组织在了一起。Package 至少为编写 PL/SQL 的开发者提供了以下的好处:

  • 将关联的功能封装到一起:这是 Package 提供的最基本的好处,可以将各种纷繁复杂的功能进行分隔和组合,通过 API 的方式提供这些功能。
  • 隐藏功能的具体实现细节:首先我们可以在保持接口不变的情况下,更改我们接口的实现,而应用程序对此无感知;其次,我们可以隐藏不希望被用户知道的实现细节。
  • 提高执行效率:在第一次调用包中的代码的时候,Oracle 数据库会将整个包加载到内存中,对同一包中其他函数,过程的调用不会导致重复的加载包。
  • 减少编译的代码量

下面是使用 Oracle SQL Developer 编写 Package 的流程:

  1. 创建一个 Package 。

    1568961153026

    1568961182880

  2. 编辑需要实现的 HELLOWORLD 函数和过程,这里类似 Java 的接口或 C 的头文件,只做函数和过程的声明。

    CREATE OR REPLACE 
    PACKAGE PACKAGE_HELLOWORLD AS 
       
      /* TODO enter package declarations (types, exceptions, methods etc) here */ 
      PROCEDURE HELLOWORLD;
      FUNCTION HELLOWORLD RETURN VARCHAR2;
       
    END PACKAGE_HELLOWORLD;
    

    1568962570633

  3. 在包名上点击右键创建包的主体。

    1568962672418

  4. 编写过程和函数的实现。

    CREATE OR REPLACE
    PACKAGE BODY PACKAGE_HELLOWORLD AS
       
      PROCEDURE HELLOWORLD AS
      BEGIN
        -- TODO: PROCEDURE PACKAGE_HELLOWORLD.HELLOWORLD所需的实施
        dbms_output.put_line('Hello World!');
      END HELLOWORLD;
       
      FUNCTION HELLOWORLD RETURN VARCHAR2 AS
      BEGIN
        -- TODO: FUNCTION PACKAGE_HELLOWORLD.HELLOWORLD所需的实施
        dbms_output.put_line('Hello World!');
        RETURN NULL;
      END HELLOWORLD;
       
    END PACKAGE_HELLOWORLD;
    
  5. 测试选中的函数或过程。

    1568962870914

以上是关于 PL/SQL 最基本的一些内容,更深入的内容将在后续的文章中继续为大家分享。

参考资料