我發現很多這樣的問題,但所有使用存儲過程的答案都是這樣。
我想要一個在Oracle Sql Developer中純粹使用查詢的答案。在連接中的所有表中搜索值(Sql開發人員)
我有一個值'CORE_AO0001031_70_EMail_1',但不知道在哪個表中。表格的數量和數據非常龐大。
如果查詢量很大並且需要時間執行,則無關緊要。有沒有這樣的查詢?
我詢問查詢的原因是,我沒有權限創建存儲過程,我不會獲得該權限。請幫助我查詢。
我發現很多這樣的問題,但所有使用存儲過程的答案都是這樣。
我想要一個在Oracle Sql Developer中純粹使用查詢的答案。在連接中的所有表中搜索值(Sql開發人員)
我有一個值'CORE_AO0001031_70_EMail_1',但不知道在哪個表中。表格的數量和數據非常龐大。
如果查詢量很大並且需要時間執行,則無關緊要。有沒有這樣的查詢?
我詢問查詢的原因是,我沒有權限創建存儲過程,我不會獲得該權限。請幫助我查詢。
使用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;
/
+1爲答案。代價昂貴,時間? – Freakyuser
沒有索引將被使用,使用了太多的CPU。所有全表掃描。還有,時間。 –
有沒有一個查詢來做到這一點?對於我來說,上面的PL/SQL的問題是,我不得不做一些小的修改,但我不知道如何去做。 – Freakyuser
但你可以執行一個匿名塊吧?這種需求僅適用於一種用途還是用於頻繁使用?如果不是你的問題,只要將你發現的任何sp粘貼到一個匿名塊中並運行即可。 – Sebas
執行一個匿名塊?我不明白你的意思。我將在稍後使用該查詢,具體取決於需求。 – Freakyuser
至少你有一個你需要搜索的模式名稱? –