2016-06-23 2 views
0

Я знаю, что это дублированный вопрос, но я не мог найти способ возобновить обсуждение. Я пытаюсь создать сохраненный процесс, который будет искать все столбцы во всех таблицах для значения. Это то, что я создал до сих пор:Искать все столбцы, все таблицы для определенного значения

CLEAR SCREEN 
SET VERIFY OFF 
ACCEPT val CHAR PROMPT 'What value do you want to search for: ' 
CLEAR SCREEN; 
DECLARE 
match_count integer; 
v_search_string varchar2(4000) := <<val>>; 
BEGIN 
FOR t IN (SELECT owner, 
table_name, 
column_name 
FROM all_tab_columns 
WHERE data_type in ('CHAR', 'VARCHAR2', 'NCHAR', 'NVARCHAR2', 
'CLOB', 'NCLOB')) 
LOOP 
    BEGIN 
    EXECUTE IMMEDIATE  
     'SELECT COUNT(*) FROM '||t.owner || '.' || t.table_name|| 
     ' WHERE '||t.column_name||' = :1' 
     INTO match_count 
     USING v_search_string; 
    IF match_count > 0 THEN 
     dbms_output.put_line(t.owner || '.' || t.table_name ||' '||t.column_name||' '||match_count); 
    END IF; 

    EXCEPTION 
     WHEN others THEN 
     dbms_output.put_line('Error encountered trying to read ' || 
      t.column_name || ' from ' || 
      t.owner || '.' || t.table_name); 
    END; 
END LOOP; 
END; 
/

но я получаю ошибки. Любая помощь будет высоко оценен!!

+4

Ну, что ошибки !? –

+1

Можете ли вы найти вопрос, который вы дублируете? Это тоже поможет – cdomination

+0

[Похоже, что это было взято из этого ответа] (http://stackoverflow.com/a/6389779/266304). –

ответ

1

Смотрите комментарии:

CLEAR SCREEN 
SET VERIFY OFF 
ACCEPT val CHAR PROMPT 'What value do you want to search for: ' 
CLEAR SCREEN; 

DECLARE 
    match_count        INTEGER; 
    v_search_string       VARCHAR2(4000) := '&val'; /* this was <<val>> */ 
BEGIN 
    FOR t IN (SELECT owner, 
        table_name, 
        column_name 
       FROM all_tab_columns 
       WHERE data_type IN ('CHAR', 
            'VARCHAR2', 
            'NCHAR', 
            'NVARCHAR2', 
            'CLOB', 
            'NCLOB')) 
    LOOP 
     BEGIN 
      EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name || ' WHERE ' || t.column_name || ' = :1' INTO match_count USING v_search_string; 

      IF match_count > 0 
      THEN 
       DBMS_OUTPUT.put_line(t.owner || '.' || t.table_name || '  ' || t.column_name || ' ' || match_count); 
      END IF; 
     EXCEPTION 
      WHEN OTHERS 
      THEN 
       DBMS_OUTPUT.put_line('Error encountered trying to read ' || t.column_name || ' from ' || t.owner || '.' || t.table_name); 
     END; 
    END LOOP; 
END; 
/ 
+0

Последние две строки, где они, они просто не были отформатированы должным образом. –

+0

Отлично! Я не получаю никаких ошибок, но он принимает время LOOOOOOOOONG, чтобы дать какие-либо результаты. В любом случае, чтобы ускорить это или указать через requestor имя db? – TrickyDBA

+0

@AlexPoole: you'reright, спасибо. Для TrickyDBA: если вы используете представления DBA или ALL, возможно, вы можете добавить фильтр по схеме; однако, это делает полное сканирование всех таблиц в схемах, которые вы хотите, поэтому вы не можете ожидать хорошей производительности. В зависимости от вашей среды вы можете отредактировать код для добавления параллельного подсказки – Aleksej

Смежные вопросы