【问题标题】:Oracle View loop on specific tables only仅针对特定表的 Oracle View 循环
【发布时间】:2021-05-25 12:46:23
【问题描述】:

我有很多表格,其中一些以数字(日期)结尾。

由于技术原因,我不得不在每个表上创建一个视图(只是一种解决方法)

当前状态类似于:

begin
  for i in (select table_name 
              from   user_tables 
              where  table_name like 'XXX_%'
             )
  loop
    execute immediate 'CREATE VIEW '||replace(i.TABLE_NAME,'XXX_','YYY_')||' AS SELECT * FROM '||i.TABLE_NAME;
  end loop;             
end;
/

它所做的只是为每个以“XXX_”开头的表创建视图。它几乎是我需要的。

但现在,有时表名看起来像“XXX_tablename_20210302”,这是手动备份。

它并不总是 8 位数字(日期),有时更短,有时更长。我想避免所有在表名末尾有数字的表(从右到左直到第一个“_”检查,它可能是一个数字?)

有人知道怎么解决吗?

我有点卡在这里。

【问题讨论】:

    标签: sql regex oracle


    【解决方案1】:

    您可以在regexp_like 中使用正则表达式:

    create table xxx_t ( c1 int );
    create table xxx_t_20210401 ( c1 int );
    
    select table_name from user_tables
    where  regexp_like ( table_name, '^XXX_.*[^0-9]+$' );
    
    TABLE_NAME   
    XXX_T         
    

    这会找到所有的表

    • 以XXX_开头XXX_
    • 后跟任何字符.*
    • 以数字结尾[^0-9]+$

    【讨论】:

    • 嘿,正则表达式解决方案听起来很有帮助。您的示例确实排除了所有以数字结尾的表格。谢谢你。但是我得到了一些表格,它们确实以数字结尾,但也包含字母,例如:“TABLE_NAME_WSTVAL01”。那张桌子被排除在外(我的错)。是否有可能仅排除最后一个“_”(下划线)之后仅包含数字的表? (表名中下划线的数量不定)。在此先感谢,并感谢您的回答。现在将深入研究正则表达式。
    • 只需修改正则表达式以满足您的要求;您可以使用regex101 之类的网站来检查它是否与您想要的匹配
    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多