联 系 我 们
售前咨询
售后咨询
微信关注:星环科技服务号
更多联系方式 >
6.8.5.5 创建 PL/SQL 语句块
更新时间:10/24/2023, 7:20:26 AM

PL/SQL 语句块可以是一个没有名字的语句块,也可以是命名的语句块(即过程和函数)。本章节中我们主要讲述匿名块的创建过程。

PL/SQL 语句块组成部分

PL/SQL 块由四个基本部分组成:声明、执行体开始、异常处理、执行体结束。

  • DECLARE —— 可选部分

    变量、常量、函数游标、用户定义异常的声明。

  • BEGIN —— 必要部分

    SQL 语句和 PL/SQL 语句构成的执行程序。

  • EXCEPTION —— 可选部分

    程序出现异常时,捕捉异常并处理异常。

  • END —— 必须部分

  • 在数据库执行 PL/SQL 程序时,PL/SQL 语句和 SQL 语句是分别进行解析和执行的。

  • PL/SQL 块被数据库内部的 PL/SQL 引擎提取,将 SQL 语句取出送给 ArgoDB 的 SQL 引擎处理,两种语句分别在两种引擎中分析处理,在数据库内部完成数据交互、处理过程。

最简单的匿名块

最简单的匿名块只包含 PL/SQL 语句块中的两个必要部分,BEGIN 和 END。

例 86. 创建最简单的匿名块
!set plsqlUseSlash true
BEGIN
   DBMS_OUTPUT.put_line ('Hello World!') -- 输出信息 Hello World
END;
/
复制

输出结果:

+---------------+
|    output     |
+---------------+
| Hello World!  |
+---------------+
复制
稍复杂的匿名块

稍复杂的匿名块除了包含 PL/SQL 语句块中的两个必要部分,BEGIN 和 END 之外,还包含一个 DECLARE 的部分,即声明变量的部分。

例 87. 创建稍复杂的匿名块
!set plsqlUseSlash true
DECLARE
   -- 定义一个 string 类型的变量 l_message,并赋值。
   l_message STRING := 'Hello World!'
BEGIN
   -- 输出 l_message 的值。
   DBMS_OUTPUT.put_line (l_message)
END;
/
复制

输出结果:

+---------------+
|    output     |
+---------------+
| Hello World!  |
+---------------+
复制
完整的匿名块

一个完整的匿名块包含了 PL/SQL 语句块的四个部分分别为 DECLARE,BEGIN,EXCEPTION,END。

例 88. 创建完整的匿名块
!set plsqlUseSlash true
DECLARE
   -- 定义一个 string 类型的变量 transid。
   transid STRING;
BEGIN
   -- 查询 transactions 表中的交易号,并放进变量 transid 中,此处 transactions 后需加上表的别名。
   SELECT trans_id
   INTO transid
   FROM transactions t1;
   -- 输出变量 transid 的值。
   PUT_LINE(transid)
EXCEPTION
   -- 引用一个情况名为 too_many_rows 的异常。
   WHEN too_many_rows
   THEN
   -- 当异常发生时的所输出的信息。
   DBMS_OUTPUT.put_line ('too many rows')
END;
/
复制

输出结果:

+----------------+
|     output     |
+----------------+
| too many rows  |
+----------------+
复制

SELECT 或 SELECT INTO 语句后如果跟函数调用或赋值语句,SELECT 或 SELECT INTO 语句不能以 FROM <TABLE_NAME> 结尾,否则函数名会被识别为 alias,ArgoDB 会报语义错误。更多用法说明及解决方法可参考注意事项

匿名块里的嵌套
  • 通过 Beeline 的方式连接数据库 SQL 引擎,并利用如下命令手动打开分号支持。

    !set plsqlUseSlash true
    复制
例 89. 匿名块里的嵌套
!set plsqlUseSlash true
DECLARE
   -- 声明外部语句块中的变量 test1。
   test1 STRING
BEGIN
   DECLARE
     -- 声明内部语句块中的变量 test2。
     test2 STRING
   BEGIN
     -- 查询 transactions 表中账号为 6513064 的交易号,并放进变量 test2 中。
     SELECT trans_time
       INTO test2
       FROM transactions
       WHERE acc_num=6513064;
     -- 输出变量 test2 的值。
     dbms_output.put_line(test2)
   EXCEPTION
     -- 引用一个 NO_DATA_FOUND 的异常情况名。
     WHEN NO_DATA_FOUND THEN
     dbms_output.put_line('no values')
   END
-- 查询 transactions 表中价格为 12.13 的交易号,并放进变量 test1 中。
SELECT trans_id
   INTO test1
   FROM transactions
   WHERE price=12.13;
-- 输出变量 test1 的值。
dbms_output.put_line(test1)
EXCEPTION
   -- 引用一个 TOO_MANY_ROWS 的异常情况名。
   WHEN TOO_MANY_ROWS THEN
   dbms_output.put_line('too many rows')
END;
/
复制

输出结果:

内部语句块中抛出异常发生时所返回的值,外部语句块中成功输出变量test1的值。

+------------+
|   output   |
+------------+
| no values  |
| 943197522  |
+------------+
复制
  • ArgoDB 中对 PL/SQL 语句块的分号支持默认是不开启的,我们可以通过命令语句手动打开。

    Beeline 连接 SQL 引擎,执行以下命令:!set plsqlUseSlash true

  • 更多用法说明,可参见后文中的注意事项章节