用于识别跨 dwh 架构的电子邮件地址的 Oracle 查询逻辑

我正在执行一项活动,以根据特定模式 (@xyz.de) 识别电子邮件地址。我最初尝试检查 DBA_TAB_COLS [数据字典] 视图,但这只是查找 email 列名,我需要手动检查大表列表。除了这样做,是否有更有效的方法来获取模式值 @xyz.de

数据库 - o​​racle 11g

使用的查询

SET SERVEROUTPUT ON 100000
    DeclARE 
    lv_count number(10):=0;
    l_str    varchar2 (1000);
    lv_col_name varchar2(255) :='EMAIL';

    BEGIN 
    FOR V1 IN 
    (select distinct table_name 
     from dba_tab_columns 
     where column_name = lv_col_name
     order by table_name)

     LOOP
      dbms_output.put_line(lv_col_name||' '||v1.table_name);    
     END LOOP;

    END;

请注意

  1. 我不完全知道表名或列名。
  2. @xyz.de 可以在任何架构、任何表和任何列中。必须以有效的方式识别这一点。

有什么建议吗?

我已经使用上面的块查询来获取电子邮件列和表名,但是如何通过使用动态 sql 搜索特定值 @xyz.de 来实现?

songxueli405 回答:用于识别跨 dwh 架构的电子邮件地址的 Oracle 查询逻辑

我不知道你想用你试图提取的值做什么,所以下面的代码只是打印它们。请参阅 Oracle 文档中的 PL/SQL Dynamic SQL

declare
  type EMAILS is ref cursor;
  L_CURSOR  EMAILS;
  cursor EMAIL_COLS is
select OWNER,TABLE_NAME,COLUMN_NAME
  from DBA_TAB_COLS
 where COLUMN_NAME like '%EMAIL%'
   and OWNER <> 'SYS';
  L_SQL  varchar2(200);
  L_EMAIL  varchar2(500);
begin
  for REC in EMAIL_COLS
  loop
    L_SQL := 'select ' || REC.COLUMN_NAME || ' from ' || REC.OWNER || '.' || REC.TABLE_NAME || ' where ' || REC.COLUMN_NAME || ' like ''%xyz.de''';
    open L_CURSOR for L_SQL;
    loop
      fetch L_CURSOR into L_EMAIL;
      exit when L_CURSOR%notfound;
      DBMS_OUTPUT.PUT_LINE(L_EMAIL);
    end loop;
  end loop;
end;
本文链接:https://www.f2er.com/977436.html

大家都在问