【问题标题】:Oracle query logic to identify email addresses across the dwh schemas用于跨 dwh 模式识别电子邮件地址的 Oracle 查询逻辑
【发布时间】:2021-02-05 09:27:23
【问题描述】:

我正在执行一项活动,以根据特定模式 (@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 来实现?

【问题讨论】:

  • 相信你在找dynamic SQL
  • @Abra - 是的,就像动态 ssql

标签: oracle plsql regexp-like


【解决方案1】:

我不知道你想对你试图提取的值做什么,所以下面的代码只是打印它们。请参阅 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多