ITPub博客

首页 > 数据库 > 数据库开发技术 > PostgreSQL 17新增Oracle兼容性

PostgreSQL 17新增Oracle兼容性

原创 数据库开发技术 作者:象楚之行 时间:2024-06-03 08:00:00 0 删除 编辑

Oracle的结构体迁移到PL/pgSQL的函数或存储过程时,下面的这段处理起来会麻烦一些:

TYPE ... IS TABLE OF tab1.column1%TYPE

TYPE ... IS TABLE OF tab1%ROWTYPE

即将发布的PostgreSQL 17将允许%TYPE和%ROWTYPE伪类型使用数组来定义变量或表的行列。

测试如下:

DO $$
DECLARE
v_all_db_names pg_database.datname%TYPE[];
v_all_dbs pg_database%ROWTYPE[];
BEGIN
SELECT array_agg(datname) INTO v_all_db_names FROM pg_database;
SELECT array_agg(d) INTO v_all_dbs FROM pg_database d;
raise notice 'All db names = %', v_all_db_names;
raise notice 'All dbs = %', v_all_dbs;
END;
$$;

返回结果如下:

NOTICE:  All db names = {postgres,template1,template0}
NOTICE: All dbs = {"(5,postgres,10,6,c,f,t,f,-1,730,1,1663,en_US.UTF-8,en_US.UTF-8,,,2.17,)","(1,template1,10,6,c,t,t,f,-1,730,1,1663,en_US.UTF-8,en_US.UTF-8,,,2.17,\"{=c/postgres,postgres=CTc/postgres}\")","(4,template0,10,6,c,t,f,f,-1,730,1,1663,en_US.UTF-8,en_US.UTF-8,,,,\"{=c/postgres,postgres=CTc/postgres}\")"}

另外%TYPE还可以作用于自定义复合类型的字段,测试如下:

先创建复合类型complex

CREATE TYPE complex AS (r float8, i float8);

再进行如下测试:

DO $$
DECLARE
a complex;
b complex.r%TYPE;
c complex.i%TYPE;
BEGIN
a := (1,2);
b := a.r;
c := a.i;
raise notice 'a = %', a;
raise notice 'b = %', b;
raise notice 'c = %', c;
raise notice '%', pg_typeof(a);
raise notice '%', pg_typeof(b);
raise notice '%', pg_typeof(c);
END;
$$;

返回结果如下:

NOTICE:  a = (1,2)
NOTICE: b = 1
NOTICE: c = 2
NOTICE: complex
NOTICE: double precision
NOTICE: double precision

推荐阅读

与我联系

  • 微信公众号:象楚之行

  • 墨天轮:https://www.modb.pro/u/15675

  • 微信:skypkmoon

勤耕细作,用心积微;静待花开,量变质成。

原文作者:象楚之行;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-06-12

  • 博文量
    102
  • 访问量
    50365