2013-12-23 2 views
0

Я нашел много таких вопросов, но ответы, где все используют хранимые процедуры.
Я хочу получить ответ, который использует исключительно запрос в Oracle Sql Developer.Поиск значения во всех таблицах в соединении (разработчик Sql)

У меня есть значение «CORE_AO0001031_70_EMail_1», но не уверен, в какой таблице. Количество таблиц и данных внутри них очень велико.

Не имеет значения, является ли запрос огромным и потребуется время для выполнения. Есть ли такой запрос?

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

+0

Но вы можете выполнить анонимный блок правильно? Эта потребность нужна только для одного использования или для частого использования? Если не проблема для вас, просто вставьте все, что вы нашли, в анонимный блок и запустите его. – Sebas

+0

Выполнять анонимный блок? Я тебя не понимаю. Я буду использовать этот запрос позже, в зависимости от требований. – Freakyuser

+0

У вас есть имя схемы, в которой вам нужен поиск? –

ответ

2

С SQL вы не можете, так как запросы будут динамическими. Вы должны выполнить PL/SQL по крайней мере. Примечание: Это дорогостоящая операция!

Вы по-прежнему можете выполнить полную загрузку всех таблиц как буферизацию и сделать PERL поиск во всех файлах. В этом случае вам нужно много места на диске, но меньше вреда (Только лучше, чем Pl/SQL) в базу данных

DECLARE 
TYPE TY_TABLE_NAMES IS TABLE OF VARCHAR2(30); 
L_TABLE_NAMES TY_TABLE_NAMES; 

TYPE TY_COLUMN_NAMES IS TABLE OF VARCHAR2(30); 
L_COLUMN_NAMES TY_COLUMN_NAMES; 

v_SCHEMA_NAME VARCHAR2(30) = 'SYSTEM'; --Your Schema Name 

v_QUERY_STRING VARCHAR2(4000); 

v_SEARCH_STRING VARCHAR2(4000) := 'CORE_AO0001031_70_EMail_1'; 

v_SEARCH_FLAG CHAR(1) := 'N'; 
BEGIN 
SELECT ALL_TABLES 
BULK COLLECT INTO L_TABLE_NAMES 
WHERE OWNER = v_SCHEMA_NAME; 

FOR I In 1..L_TABLE_NAMES.COUNT LOOP 
    SELECT COLUMN_NAME 
    BULK COLLECT INTO L_COLUMN_NAMES 
    FROM ALL_TAB_COLUMNS 
    WHERE TBALE_NAME = L_TABLE_NAMES(I) 
    AND OWNER = v_SCHEMA_NAME; 

    FOR J In 1..L_COLUMN_NAMES.COUNT LOOP 
     BEGIN 
      v_QUERY_STRING := 'SELECT ''Y'' FROM DUAL WHERE EXISTS (SELECT ''X'' FROM '||L_TABLE_NAMES(I)||' WHERE '|| 
           ||L_COLUMN_NAMES(J)|| ' LIKE ''%'|| v_SEARCH_STRING||'%'')'; 
      EXCECUTE IMMEDIATE v_QUERY_STRING INTO v_SEARCH_FLAG; 
     WHEN NO_DATA_FOUND THEN 
      v_SEARCH_FLAG := 'N'; 
     END; 

     IF(v_SEARCH_FLAG = 'Y') THEN 
      DBMS_OUTPUT.PUT_LINE(v_SEARCH_STRING || ' found in column '||L_COLUMN_NAMES(I)|| ' of table '||L_TABLE_NAMES(I)); 
      BREAK; 
     END IF; 
    END LOOP; 
    IF(v_SEARCH_FLAG = 'Y') THEN 
     DBMS_OUTPUT.PUT_LINE('Done Searching!'); 
     BREAK; 
    END IF; 
END LOOP; 
END; 
/
+0

+1 для ответа. Дорогостоящий в смысле, Время? – Freakyuser

+0

Не будут использоваться индексы, поэтому используется большое количество CPU. Все полные сканированные таблицы.! Кроме того, время. –

+0

Есть ли запрос для этого? Проблема с вышеперечисленным PL/SQL для меня заключается в том, что я должен внести незначительные изменения, но я не знаю, как это сделать. – Freakyuser

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