在字符串中的特殊位置添加一个单词

问题描述 投票:0回答:1

我有一个包含查询列表的表,我想将数据库链接添加到源表列表的末尾。比如我有

> Select * from s1.table t1,s2.table2 ,s3.table3;

我想将其转换为

> Select * from s1.table@dblink t1,s2.table2@dblink ,s3.table3@dblink;

所有表都有模式名称。 有些表有别名,但另一些则没有。 谢谢大家,如果可以给我一个提示

oracle-database plsql
1个回答
0
投票

如果存储的查询看起来像您所说的那样,那么您可以使用正则表达式并进行替换(请参阅以下示例中的 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>

当然,有多种组合可能会产生错误的结果(分割线、附加空格、子查询、内联视图等)。

因此,还有一些建议:

  • 有多少行?如果不是那么多,手动添加数据库链接
  • 为您通过数据库链接访问的所有表创建
  • 同义词。这样做,您不必修改存储的查询
      如果当前模式已经包含名称与您通过数据库链接查询的表名称相同的对象,则这将不起作用
© www.soinside.com 2019 - 2024. All rights reserved.