如何在SQL Developer/DBeaver中溯源Oracle自定义表的数据源及字段来源
Oracle自定义表
xxhiu.xxhiu_13mth_quantities数据溯源实操 基于现有包代码的逻辑拆解
- 这段代码的核心是通过PIVOT行转列完成数据写入,没有任何嵌套多表关联逻辑,所有写入目标表的数据,唯一来源就是子查询指定的
xxhiu.xxhiu_13mth_stats表,你的初始判断是正确的。 - 你困惑的
m1_sales、m2_sales等字段没有和源表直接同名匹配,本质是代码里存在大量截断占位(标注etc.的部分),PIVOT的输出列和目标表字段是按位置一一对应的,不是按字段名匹配的:- 内层子查询从
xxhiu_13mth_stats取数,选取的字段包括维度字段(gl_seq、item_id、organization_id)、度量字段(fifo_avg、fcst_avg等) - PIVOT块把
gl_seq的行值转成列名,对每个度量值做聚合,生成的输出列格式为[度量名]_[gl_seq别名],比如fifo_avg_seq01、fcst_avg_seq09 - INSERT语句把这些PIVOT输出的列,按顺序对应到目标表的
m1_sales、m2_sales等自定义命名的字段上,没有其他隐藏的数据源。
- 内层子查询从
注:你贴的代码片段存在语法截断(比如PIVOT的IN子句里多了左括号、日期计算部分把
sysdate拆成了syst date),是手动复制时的内容缺失,不影响整体溯源逻辑的判断。
SQL Developer/DBeaver可直接执行的溯源查询方法
不需要手动翻找全量包代码,通过Oracle内置数据字典就能完成全链路溯源:
- 定位所有写入目标表的代码位置
执行以下查询,就能拉出所有对xxhiu_13mth_quantities做TRUNCATE、INSERT操作的包、存储过程、触发器代码位置:SELECT owner, name, type, line, text FROM all_source WHERE owner = 'XXHIU' AND UPPER(text) LIKE '%XXHIU_13MTH_QUANTITIES%' AND (UPPER(text) LIKE '%TRUNCATE%' OR UPPER(text) LIKE '%INSERT%') ORDER BY name, line; - 确认源表和目标表的字段映射关系
- 先查源基础表
xxhiu_13mth_stats的所有字段,确认所有可被PIVOT聚合的度量字段:SELECT column_name, data_type FROM all_tab_columns WHERE owner = 'XXHIU' AND table_name = 'XXHIU_13MTH_STATS' ORDER BY column_id; - 再查目标表
xxhiu_13mth_quantities的字段排序,和PIVOT输出的列顺序一一比对,就能完全确认哪个目标字段对应源表的哪个度量、哪个gl_seq值:SELECT column_name, column_id FROM all_tab_columns WHERE owner = 'XXHIU' AND table_name = 'XXHIU_13MTH_QUANTITIES' ORDER BY column_id;
- 先查源基础表
- 验证溯源结果的最直接方式
从目标表随机抽取1条记录,拿它的item_id、organization_id维度值,回到xxhiu_13mth_stats中匹配对应gl_seq的聚合值,校验两边数值是否一致,即可100%确认溯源关系。
内容的提问来源于stack exchange,提问作者becs
相关产品推荐
相关产品推荐

