搜索连接中所有表中的值(Sql developer)

时间:2013-12-23 07:56:29

标签: sql oracle oracle-sqldeveloper

我发现了许多这样的问题,但答案都是使用存储过程 我想要一个在Oracle Sql Developer中纯粹使用查询的答案。

我有一个值'CORE_AO0001031_70_EMail_1'但不确定在哪个表中。表中的数量和数据非常庞大。

如果查询很大并且需要时间来执行,则无关紧要。有没有这样的查询?

我询问查询的原因是,我没有权限创建存储过程,我将不会获得该特权。请帮我查询。

1 个答案:

答案 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;
/