我正在开发 Oracle 11g。我得到一个用户提供的查询,例如
SELECT mycolumn
FROM myschema.mytable
查询可以是任意复杂的子查询,并且事先不知道。现在我想更改查询并将源表的所有用法重定向mytable
到另一个表mytable_mod
,无论它们发生在查询或子查询中的哪个位置。
当然,您可以搜索字符串以查找 的出现mytable
,但这是一种非常不可靠的方法,因为查询的其他部分可能具有相同的名称(例如列,或一些注释)
我尝试使用该语句创建一个视图并用于DBMS_METADATA
分析它:
CREATE OR REPLACE VIEW MYSCHEMA.TESTVIEW as
SELECT mycolumn FROM myschema.mytable
DBMS_METADATA
您可以像这样替换架构(经过一些准备):
dbms_metadata.set_remap_param(handler, 'REMAP_SCHEMA',
'MYSCHEMA', 'MY_OTHER_SCHEMA');
用REMAP_NAME
代替REMAP_SCHEMA
你可以替换对象名称。但是这两种方法都只引用视图名称,而不是视图查询中使用的对象。所以结果是
CREATE OR REPLACE VIEW MY_OTHER_SCHEMA.TESTVIEW as
SELECT mycolumn FROM myschema.mytable
另一个想法是将创建视图语句输出为 XML 对象。我得到所有列定义和视图名称,但查询本身只是 xml 中的一个文本标记。我的想法是
- 将查询提取为 xml
- 通过查看标签替换我想要的对象
- 用于
DBMS_METADATA.CONVERT
将 xml 转换回 ddl 语句。
但正如我所说,xml 本身并不包含 sql 查询结构。有人知道如何将 sql 语句结构化为“xml 对象”或其他结构化形式吗?