2013-12-23 33 views
0

我發現很多這樣的問題,但所有使用存儲過程的答案都是這樣。
我想要一個在Oracle Sql Developer中純粹使用查詢的答案。在連接中的所有表中搜索值(Sql開發人員)

我有一個值'CORE_AO0001031_70_EMail_1',但不知道在哪個表中。表格的數量和數據非常龐大。

如果查詢量很大並且需要時間執行,則無關緊要。有沒有這樣的查詢?

我詢問查詢的原因是,我沒有權限創建存儲過程,我不會獲得該權限。請幫助我查詢。

+0

但你可以執行一個匿名塊吧?這種需求僅適用於一種用途還是用於頻繁使用?如果不是你的問題,只要將你發現的任何sp粘貼到一個匿名塊中並運行即可。 – 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

相關問題