仅读权限下如何提取OWB/ODI生成包中的INSERT/SELECT SQL语句?
只读权限下逆向工程OWB/ODI生成的MST表加载逻辑
一、用数据字典视图直接提取包内SQL(无需DBA权限)
你当前的只读权限可直接利用Oracle自带的数据字典视图,先定位负责填充MST_GENERAL_STUDENT的自动生成包,再提取其中的转换SQL:
1. 定位关联的OWB/ODI生成包
通过ALL_DEPENDENCIES查询对目标表有写入依赖的包:
SELECT DISTINCT owner, name, type FROM all_dependencies WHERE referenced_owner = '<你的ODS schema名>' AND referenced_name = 'MST_GENERAL_STUDENT' AND referenced_type = 'TABLE' AND type IN ('PACKAGE', 'PACKAGE BODY');
注:替换<你的ODS schema名>为表实际所属的schema,比如ODS_STAGING。
2. 提取包内的SQL转换逻辑
用ALL_SOURCE查询上述包的源码,OWB/ODI生成的包通常会把INSERT/SELECT逻辑硬编码在包体中:
SELECT text FROM all_source WHERE owner = '<包所属的owner>' AND name = '<查到的包名>' AND type = 'PACKAGE BODY' ORDER BY line;
在结果中搜索包含INSERT INTO MST_GENERAL_STUDENT或SELECT ... FROM的行,这些就是实际转换语句。如果遇到动态SQL(比如EXECUTE IMMEDIATE拼接的语句),重点查找拼接SQL的字符串片段即可。
二、如果数据字典查不到完整逻辑(动态SQL/运行时生成)
如果包内采用完全动态生成的SQL,或逻辑仅在OWB/ODI的元数据中定义,确实需要DBA权限访问工具专属的元数据表:
- OWB场景:需访问OWB仓库的
WB_RT_*(运行时日志)或WB_*(设计元数据)表,比如WB_RT_AUDIT_DETAILS可查询运行时执行的SQL。 - ODI场景:需访问ODI工作库的
SNP_SESSION_STEP_LOG表,该表记录了每个会话执行的SQL语句。
三、补充技巧:从运行时SQL历史提取
如果你的账号拥有SELECT_CATALOG_ROLE权限(部分只读账号会开放),可查询最近执行的SQL历史:
-- 查询最近执行的针对MST_GENERAL_STUDENT的INSERT语句 SELECT sql_text FROM v$sql WHERE sql_text LIKE '%INSERT INTO MST_GENERAL_STUDENT%' AND parsing_schema_name = '<ODS schema名>' ORDER BY last_active_time DESC;
若需查询历史会话,还可尝试访问DBA_HIST_SQLTEXT(需DBA授权,但部分环境会开放只读访问)。
四、迁移到AWS的注意事项
拿到转换SQL后,需做适配调整:
- 替换Oracle特有函数(如
NVL→COALESCE,TO_DATE→AWS兼容的日期函数) - 调整分区、索引逻辑以适配AWS数据仓库(Redshift/Athena等)
- 将原有增量加载逻辑(如基于时间戳的增量)转换为AWS生态的调度方式(如Glue调度)
内容的提问来源于stack exchange,提问作者Data Monger
相关产品推荐
相关产品推荐

