1+ -- src/backend/catalog/ora_all_tab_columns.sql
2+ -- Oracle兼容 ALL_TAB_COLUMNS 系统视图定义
3+ CREATE OR REPLACE VIEW pg_catalog .ALL_TAB_COLUMNS
4+ (
5+ OWNER, -- 模式名(对应Oracle的所有者)
6+ TABLE_NAME, -- 表/视图名
7+ COLUMN_NAME, -- 列名
8+ COLUMN_ID, -- 列序号
9+ DATA_TYPE, -- 数据类型
10+ DATA_LENGTH, -- 数据长度
11+ DATA_PRECISION, -- 数值精度
12+ DATA_SCALE, -- 小数位
13+ NULLABLE, -- 空值标识(Y/N)
14+ DATA_DEFAULT, -- 默认值
15+ TABLE_TYPE, -- 表类型(TABLE/VIEW)
16+ CHAR_LENGTH, -- 字符长度
17+ CHAR_USED, -- 字符使用方式(BYTE/CHAR)
18+ DBA_COLUMN_ID -- 兼容Oracle的DBA级列ID
19+ )
20+ AS
21+ SELECT
22+ n .nspname ::varchar ,
23+ c .relname ::varchar ,
24+ a .attname ::varchar ,
25+ a .attnum ::numeric ,
26+ CASE
27+ -- Oracle数据类型 → IvorySQL映射(关键兼容点)
28+ WHEN t .typname = ' int4' THEN ' NUMBER'
29+ WHEN t .typname = ' varchar' THEN ' VARCHAR2'
30+ WHEN t .typname = ' text' THEN ' CLOB'
31+ WHEN t .typname = ' timestamp' THEN ' DATE'
32+ ELSE t .typname ::varchar
33+ END,
34+ -- 修正:保证DATA_LENGTH非负
35+ CASE WHEN a .atttypmod > 0 THEN GREATEST(a .atttypmod - 4 , 0 ) ELSE NULL END::numeric ,
36+ CASE WHEN t .typname IN (' numeric' , ' decimal' ) THEN (a .atttypmod >> 16 ) & 65535 ELSE NULL END::numeric ,
37+ CASE WHEN t .typname IN (' numeric' , ' decimal' ) THEN a .atttypmod & 65535 ELSE NULL END::numeric ,
38+ CASE WHEN a .attnotnull THEN ' N' ELSE ' Y' END::varchar ,
39+ -- 修正:默认值NULL时显示空字符串,对齐Oracle
40+ COALESCE(pg_get_expr(ad .adbin , ad .adrelid )::varchar , ' ' )::varchar ,
41+ CASE c .relkind WHEN ' r' THEN ' TABLE' WHEN ' v' THEN ' VIEW' ELSE NULL END::varchar ,
42+ -- 修正:保证CHAR_LENGTH非负
43+ CASE WHEN t .typname IN (' varchar' , ' char' ) THEN GREATEST(a .atttypmod - 4 , 0 ) ELSE NULL END::numeric ,
44+ CASE WHEN t .typname IN (' varchar' , ' char' ) THEN ' CHAR' ELSE ' BYTE' END::varchar ,
45+ a .attnum ::numeric
46+ FROM
47+ pg_namespace n
48+ JOIN pg_class c ON n .oid = c .relnamespace
49+ JOIN pg_attribute a ON c .oid = a .attrelid
50+ JOIN pg_type t ON a .atttypid = t .oid
51+ LEFT JOIN pg_attrdef ad ON a .attrelid = ad .adrelid AND a .attnum = ad .adnum
52+ WHERE
53+ c .relkind IN (' r' , ' v' ) -- 仅表和视图
54+ AND a .attnum > 0 -- 排除系统隐藏列
55+ AND NOT a .attisdropped ; -- 排除已删除列;
56+
57+ -- 授予所有用户查询权限(对齐Oracle的PUBLIC权限)
58+ GRANT SELECT ON pg_catalog .ALL_TAB_COLUMNS TO PUBLIC;
59+
60+ -- 修正:IvorySQL兼容的PUBLIC同义词语法
61+ CREATE OR REPLACE SYNONYM ALL_TAB_COLUMNS FOR pg_catalog .ALL_TAB_COLUMNS ;
0 commit comments