Oracle迁移至PostgreSQL:Oracle中tab对象的PostgreSQL等价替代实现
PostgreSQL适配Oracle
select * from tab;的替代方案 PostgreSQL无内置的同名tab系统对象,可通过自定义系统视图、直接查询系统目录的方式完全覆盖原语句的使用场景,具体实现如下:
- 完全对齐原Oracle查询习惯的适配方案
创建与Oracle逻辑完全一致的自定义tab视图,后续执行select * from tab;即可得到与原环境一致的返回结果(包含对象名、对象类型字段):
CREATE OR REPLACE VIEW tab AS SELECT c.relname AS tname, CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'v' THEN 'VIEW' WHEN 'm' THEN 'MATERIALIZED VIEW' WHEN 's' THEN 'SEQUENCE' WHEN 'f' THEN 'FOREIGN TABLE' WHEN 'p' THEN 'PARTITIONED TABLE' END AS tabtype, NULL AS clusterid FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = current_schema() AND c.relkind IN ('r','v','m','s','f','p') AND c.relispartition = false AND pg_catalog.pg_table_is_visible(c.oid);
- 全量对象清单查询方案
如果需要获取当前用户有权限访问的、全库范围内所有非系统内置的表、视图等对象,可直接执行以下系统目录查询:
SELECT n.nspname AS schema_name, c.relname AS object_name, CASE c.relkind WHEN 'r' THEN '普通表' WHEN 'v' THEN '视图' WHEN 'm' THEN '物化视图' WHEN 's' THEN '序列' WHEN 'f' THEN '外部表' WHEN 'p' THEN '分区表' END AS object_type FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast') AND c.relkind IN ('r','v','m','s','f','p') AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY schema_name, object_name;
逻辑差异说明:原生Oracle
tab视图默认仅返回当前登录用户默认schema下的自有对象,上述自定义创建的tab视图完全匹配该逻辑,无需修改原有应用的查询语句即可平滑运行。
内容的提问来源于stack exchange,提问作者dros
相关产品推荐
相关产品推荐

