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和空语句。