从 Oracle 读取字段注释时,不能把查询结果的第一个注释直接贴给另一次查询的第一列。先按字段身份关联,再按需要明确排序,才能避免注释与字段错位。

用 COLUMN_ID 排出表定义中的列顺序

2018 年遇到的问题是:直接查 USER_COL_COMMENTS 后,注释顺序与表字段顺序不一致。处理方式是关联列元数据:

SELECT c.column_name, c.comments, t.column_id
FROM user_col_comments c
JOIN user_tab_columns t
  ON t.table_name = c.table_name
 AND t.column_name = c.column_name
WHERE c.table_name = :table_name
ORDER BY t.column_id

:table_name 是绑定参数占位符,按所用客户端或驱动绑定,不把外部输入拼接进 SQL。普通未加引号的标识符在字典中通常是大写;带双引号创建的名称则应按实际字典值匹配,不能一概对所有输入转大写。

USER_COL_COMMENTS 面向当前用户拥有对象的列注释;列元数据中的 COLUMN_ID 表示创建时的列序号。没有 ORDER BY 就不应依赖偶然返回的顺序。

跨 schema 时,要把 OWNER 放入匹配条件

如果读取的是其他用户的可访问对象,改查 ALL 视图时不能只按表名和列名关联,因为不同 schema 可能有同名表:

SELECT c.owner, c.table_name, c.column_name,
       c.comments, t.column_id
FROM all_col_comments c
JOIN all_tab_columns t
  ON t.owner = c.owner
 AND t.table_name = c.table_name
 AND t.column_name = c.column_name
WHERE c.owner = :owner
  AND c.table_name = :table_name
ORDER BY t.column_id

ALL 视图也不表示无需权限即可读全部对象。应确认当前连接身份、owner 和对象名,空注释保留为空,不把它当作查询丢了一列。

表定义顺序,不等于业务 SELECT 的顺序

SELECT name, id、表达式、别名、关联表及视图都可以改变结果投影。若要给任意查询结果添加说明,应以明确的字段映射或结果集元数据为依据,不能只套表的 COLUMN_ID 顺序。

验证时把列名、列序号和注释一起显示,覆盖空注释、同名跨 schema、大小写敏感标识符和显式投影;不要只比较两份列表长度相同,就认定对应关系正确。