3.2.10. PLSQL

本章主要介绍统一SQL对Oracle数据库的PLSQL转换到其他数据库中存在的一些 差异点;具体支持PLSQL边界可参考 统一SQL使用边界规范

3.2.10.1. LightDB-Oracle

3.2.10.1.1. PL/SQL 匿名块

描述

PL/SQL 匿名块程序由三个块组成,即声明部分(DECLARE)、执行部分(BEGIN)和异常处理部分(EXCEPTION)。

三个部分的作用如下:

声明部分:在此声明 PL/SQL 用到的变量、类型、游标以及局部的存储过程和函数。

执行部分:显示执行过程及 SQL 语句,是程序的主要部分。

异常处理部分:显示错误处理。暂不支持。

语法

DECLARE
   /* 声明部分: 在此声明 PL/SQL 用到的变量、类型、游标以及局部的存储过程和函数 */
BEGIN
   /*  执行部分:  过程及 SQL 语句,即程序的主要部分  */
EXCEPTION
      /* 异常处理部分: 错误处理  */
END;

示例

-- 转换前Oracle PL/SQL 匿名块:
declare v_rowcount number(10);
begin
   select count(1) into v_rowcount
   from user_objects WHERE object_type = 'index' and object_name = upper('idx2_${indexSuffix}');

if v_rowcount >0 then execute immediate 'create index idx2_${indexSuffix} on ${tableName}(can_send_datetime)';
end if;
end;


-- 转换后TDSQL-Oracle模式 匿名块:
DO $$
DECLARE
v_rowcount number(10);
BEGIN
   SELECT count(1) INTO v_rowcount FROM user_objects WHERE object_type='index' AND object_name=upper('idx2_${indexSuffix}');
IF v_rowcount>0 THEN EXECUTE IMMEDIATE 'create index idx2_${indexSuffix} on ${tableName}(can_send_datetime)';
END IF;
END;
$$;

警告

下面列举的是在使用统一SQL的PL/SQL时的部分疑问点

  • 斜杠 / 是 SQL*Plus 结束 PL/SQL 块并执行它,统一SQL不会去转化的。

  • PL/SQL块的执行部分,支持BEGIN、END、IF THEN分支,loop循环,变量,赋值(:=),但存在限制,loop循环的循环变量上、下界前后需要添加空格,仅支持简单默认的循环,不支持REVERSE。

  • PL/SQL的匿名块语法是否正确不考虑,具体是否错误由执行层保证。

  • 支持范围仅考虑匿名块,EXECUTE IMMEDIATE后面的SQL直接透传,不支持存储过程、函数、触发器、包,不支持自治事务,不支持异常,不支持嵌套匿名块,不支持绑定变量,不支持单条NULL和空语句。