PL/pgSQL 到 PL/vSQL 迁移指南

虽然 Vertica PL/vSQL 在很大程度上与 PostgreSQL PL/pgSQL 兼容,但从 PostgreSQL PL/pgSQL 迁移时,存在一些易于解决的语义和 SQL 级别差异。

语言级别差异

下面列出了 Vertica PL/vSQL 与 PostgreSQL PL/pgSQL 之间的显著差异。在 Vertica PL/vSQL 中:

  • 必须将 PERFORM 语句用于未返回任何值的 SQL 语句。

  • UPDATE/DELETE WHERE CURRENT OF 不受支持。

  • FOR 循环具有附加关键字:

    • FOR (RANGE) 循环RANGE 关键字

    • FOR (QUERY) 循环:QUERY 关键字

    • FOR (CURSOR) 循环:CURSOR 关键字

  • 默认情况下,NULL 不能强制转换为 FALSE。

解决方法:将 NULL 强制转换为 FALSE

与 PostgreSQL PL/pgSQL 不同,在 Vertica PL/vSQL 中,NULL 不可强制转换为 false。当赋值 NULL 时,预期获得布尔值的表达式会引发异常:

=> DO $$
BEGIN
    IF NULL THEN -- boolean value expected for IF
    END IF;
END;
$$;

ERROR 10268:  Query returned null where a value was expected

要使 NULL 强制转换为 false,请启用配置参数 PLvSQLCoerceNull:

=> ALTER DATABASE DEFAULT SET PLvSQLCoerceNull = 1;

计划的功能

在将来版本中,计划支持以下功能:

  • 完整事务和会话语义。目前,存储过程在执行之前提交事务,每个嵌入式 SQL 语句在其自己的自动提交事务中执行。它具有以下含义: * 您不能回退。 * 会话级别的更改(如创建定向查询或设置会话级别参数)将成功,但是没有作用。

  • OUT/INOUT 参数模式

  • FOREACH (ARRAY) 循环

  • 使用以下类型作为实参: * DECIMAL * NUMERIC * NUMBER * MONEY * UUID

  • 非正向移动游标

  • 用于诊断的 CONTEXT/EXCEPTION_CONTEXT。

  • 特殊变量 ROW_COUNT。

SQL 级别差异

下面说明了 Vertica 和 PostgreSQL 之间在架构和 SQL 级别上的显著差异。在 Vertica 中:

  • 一些数据类型大小不同 — 例如,Vertica 中的标准 INTEGER 为 8 字节,但 PostgreSQL 中为 4 字节。

  • INSERT、UPDATE 和 DELETE 返回受影响的行数。

  • 某些 SQLSTATE 代码不同,这会影响异常处理