首页 > 数据库 > 数据库开发技术 > PostgreSQL 17新增Oracle兼容性
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
勤耕细作,用心积微;静待花开,量变质成。
原文作者:象楚之行;如有侵权,请联系管理员删除。