我有一个包含查询列表的表,我想将数据库链接添加到源表列表的末尾。比如我有
> Select * from s1.table t1,s2.table2 ,s3.table3;
我想将其转换为
> Select * from s1.table@dblink t1,s2.table2@dblink ,s3.table3@dblink;
所有表都有模式名称。 有些表有别名,但另一些则没有。 谢谢大家,如果可以给我一个提示
如果存储的查询看起来像您所说的那样,那么您可以使用正则表达式并进行替换(请参阅以下示例中的 ID = 1,这会产生您想要的结果)。
但是,由于这样的正则表达式会影响“单词后跟点后跟单词”的任何组合(即
(\w+)(\.)(\w+)
),请包含from
,这样就不会添加数据库链接名称,例如ID = 2
“table_alias.column_name”(t1.name
)。
SQL> with test (id, col) as
2 (select 1, 'Select * from s1.table t1,s2.table2 ,s3.table3;' from dual union all
3 select 2, 'select t1.name, t2.* from s1.table t1, s2.table2;' from dual)
4 select id,
5 regexp_replace(col, 'from (\w+)(\.)(\w+)', 'from \1\2\3@dblink') result
6 from test;
ID RESULT
---------- ------------------------------------------------------------
1 Select * from s1.table@dblink t1,s2.table2 ,s3.table3;
2 select t1.name, t2.* from s1.table@dblink t1, s2.table2;
SQL>
当然,有多种组合可能会产生错误的结果(分割线、附加空格、子查询、内联视图等)。
因此,还有一些建议: