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 语句。
-
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。
注意
一种解决方法是,您可以依赖 INSERT、UPDATE 和 DELETE 返回受影响的行数:
=> CREATE TABLE t1(i int); CREATE TABLE
=> DO $$ DECLARE x int; BEGIN x := INSERT INTO t1 VALUES (200); RAISE INFO 'rows inserted: %', x; END; $$;
INFO 2005: rows inserted: 1
SQL 级别差异
下面说明了 Vertica 和 PostgreSQL 之间在架构和 SQL 级别上的显著差异。在 Vertica 中: