दिलचस्प पोस्ट
जावास्क्रिप्ट और getElementById एक ही आईडी के साथ कई तत्वों के लिए बटन प्रेस पर UITableView सेल की पंक्ति हो रही है पायथन में बहुरेखित टिप्पणियां बनाने का तरीका? JQuery – $ परिभाषित नहीं है क्लोन विधि को ठीक से कैसे ओवरराइड करें? एक स्ट्रिंग के भीतर एक निर्दिष्ट वर्ण के सभी अनुक्रमणिका खोजना मैं जावास्क्रिप्ट और XMLHttpRequest का उपयोग कर बाइनरी छवि डेटा कैसे लोड करूं? 25 9 वर्णों से अधिक नाम वाली फाइलों से कैसे निपटें? मैं कैसे अपाचे 2.x में mod_deflate के साथ फ़ाइलों को पूर्व सेक कर सकता हूँ? पायथन में अनन्य एक्सेस के लिए फ़ाइल खोलने का सबसे अच्छा तरीका क्या है? पायथन में कोई ++ और – ऑपरेटर क्यों नहीं हैं? Android ACTION_IMAGE_CAPTURE आशय क्रैश या "विभाजन गलती" जब डेटा की प्रतिलिपि बनाई गई है / स्कैन / अपर्याप्त संकेतक को पढ़ना वेक्टर को सी ++ में सरणी में कनवर्ट कैसे करें वस्तुओं के जावास्क्रिप्ट फ़िल्टर सरणी

एक विशिष्ट मान (ओरेकल) के लिए सभी टेबल्स में सभी फ़ील्ड खोजें

क्या ओरेकल में किसी विशेष मान के लिए प्रत्येक तालिका के प्रत्येक क्षेत्र को खोजना संभव है?

कुछ तालिकाओं में हज़ारों पंक्तियों के साथ सैकड़ों तालिकाओं हैं, इसलिए मुझे पता है कि इससे क्वेरी के लिए बहुत समय लगता है। लेकिन केवल एक चीज जो मुझे पता है वो है कि फ़ील्ड के लिए मैं 1/22/2008P09RR8 । <

मैंने नीचे दिए गए इस कथन का उपयोग करने के लिए एक उपयुक्त कॉलम ढूंढने की कोशिश की है जो मुझे लगता है कि इसका नाम होना चाहिए, लेकिन इसके परिणामस्वरूप कोई परिणाम नहीं मिला।

 SELECT * from dba_objects WHERE object_name like '%DTN%' 

इस डाटाबेस में बिल्कुल कोई दस्तावेज नहीं है और मुझे नहीं पता है कि यह क्षेत्र जहां से खींच लिया गया है।

कोई विचार?

वेब के समाधान से एकत्रित समाधान "एक विशिष्ट मान (ओरेकल) के लिए सभी टेबल्स में सभी फ़ील्ड खोजें"

उद्धरण:

मैंने नीचे दिए गए इस कथन का उपयोग करने के लिए एक उचित कॉलम ढूंढने की कोशिश की है जो मुझे लगता है कि इसका नाम होना चाहिए, लेकिन इसके परिणामस्वरूप कोई परिणाम नहीं मिला। *

 SELECT * from dba_objects WHERE object_name like '%DTN%' 

एक स्तंभ एक वस्तु नहीं है यदि आप का मतलब है कि आप कॉलम नाम को '% DTN%' जैसा मानते हैं, तो आप जो क्वेरी चाहते हैं वह है:

 SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%'; 

लेकिन अगर 'डीटीएन' स्ट्रिंग आपके भाग में अनुमान लगा रही है, तो संभवत: इससे कोई मदद नहीं मिलेगी।

वैसे, आप कितने निश्चित हैं कि '1/22/2008 पी 0 9 आरआर 8' एक कॉलम से सीधे चयनित मान है? अगर आपको ये पता नहीं है कि वह कहां से आ रहा है, तो यह कई स्तंभों का एक संयोजन हो सकता है, या कुछ फ़ंक्शन के नतीजे, या नेस्टेड टेबल ऑब्जेक्ट में बैठे मान हो सकता है। तो आप उस मूल्य के लिए प्रत्येक कॉलम को जांचने की कोशिश कर रहे एक जंगली हंस का पीछा कर सकते हैं। क्या आप उस क्लाइंट एप्लिकेशन के साथ शुरू नहीं कर सकते हैं जो इस मान को प्रदर्शित कर रहे हैं और यह पता लगाने की कोशिश करें कि इसे प्राप्त करने के लिए किस क्वेरी का उपयोग किया जा रहा है?

वैसे भी, डीसीयू के उत्तर में एसक्यूएल प्रश्नों को पैदा करने का एक तरीका मूल्य के लिए प्रत्येक तालिका के प्रत्येक स्तंभ की जांच करता है। आप पीएल / एसक्यूएल ब्लॉक और गतिशील एसक्यूएल का उपयोग करके एक एसक्यूएल सत्र में पूरी तरह से इसी तरह की सामग्री भी कर सकते हैं। इसके लिए कुछ जल्द-लिखित कोड दिया गया है:

  SET SERVEROUTPUT ON SIZE 100000 DECLARE match_count INTEGER; BEGIN FOR t IN (SELECT owner, table_name, column_name FROM all_tab_columns WHERE owner <> 'SYS' and data_type LIKE '%CHAR%') LOOP EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name || ' WHERE '||t.column_name||' = :1' INTO match_count USING '1/22/2008P09RR8'; IF match_count > 0 THEN dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count ); END IF; END LOOP; END; / 

ऐसे कुछ तरीके हैं जो आप इसे अधिक कुशल बना सकते हैं।

इस मामले में, जिस मान को आप खोज रहे हैं, उसे आप किसी भी कॉलम को NUMBER या DATE प्रकार से स्पष्ट रूप से हटा सकते हैं, जिससे प्रश्नों की संख्या कम हो जाएगी। हो सकता है कि उसे कॉलम पर भी सीमित करें जहां प्रकार '% CHAR%' की तरह है।

प्रति स्तंभ एक क्वेरी के बजाय, आप इस तरह एक तालिका प्रति एक क्वेरी बना सकते हैं:

 SELECT * FROM table1 WHERE column1 = 'value' OR column2 = 'value' OR column3 = 'value' ... ; 

अगर आप केवल एक मालिक की खोज कर रहे हैं तो मैंने इसे ऊपर काम करने के लिए कुछ बदलाव किए हैं। आपको बस 3 वैरिएबल्स v_owner, v_data_type और v_search_string को बदलने के लिए क्या करना है जो आप खोज रहे हैं।

 SET SERVEROUTPUT ON SIZE 100000 DECLARE match_count INTEGER; -- Type the owner of the tables you are looking at v_owner VARCHAR2(255) :='ENTER_USERNAME_HERE'; -- Type the data type you are look at (in CAPITAL) -- VARCHAR2, NUMBER, etc. v_data_type VARCHAR2(255) :='VARCHAR2'; -- Type the string you are looking at v_search_string VARCHAR2(4000) :='string to search here...'; BEGIN FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and data_type = v_data_type) LOOP EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||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.table_name ||' '||t.column_name||' '||match_count ); END IF; END LOOP; END; / 

हाँ आप कर सकते हैं और आपका डीबीए आपको नफरत करेगा और आपको अपने जूतों को मंजिल पर खटखटायेगा क्योंकि यह बहुत सारे आई / ओ का कारण होगा और कैश पुर्जों के रूप में डेटाबेस प्रदर्शन को वास्तव में नीचे लाएगा।

 select column_name from all_tab_columns c, user_all_tables u where c.table_name = u.table_name; 

एक शुरुआत के लिए।

मैं v$session और v$sqlarea का उपयोग करते हुए चल रहे प्रश्नों के साथ शुरू होगा यह ओरेकल संस्करण के आधार पर बदलता है। यह अंतरिक्ष को कम कर देगा और सब कुछ नहीं मारा जाएगा।

मुझे पता है यह एक पुराना विषय है लेकिन मुझे सवाल पूछने पर एक टिप्पणी दिखाई दे रही है कि क्या PL/SQL इस्तेमाल करने के बजाय SQL में ऐसा किया जा सकता है। तो एक समाधान पोस्ट करने के लिए सोचा

नीचे दिए गए प्रदर्शन पूरे SCHEMA में सभी तालिकायों के सभी COLUMNS में VALUE के लिए खोज करना है :

  • एक CHARACTER प्रकार खोजें

चलो SCOTT स्कीमा में वैल्यू KING की तलाश करें

 SQL> variable val varchar2(10) SQL> exec :val := 'KING' PL/SQL procedure successfully completed. SQL> SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword", 2 SUBSTR (table_name, 1, 14) "Table", 3 SUBSTR (column_name, 1, 14) "Column" 4 FROM cols, 5 TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select ' 6 || column_name 7 || ' from ' 8 || table_name 9 || ' where upper(' 10 || column_name 11 || ') like upper(''%' 12 || :val 13 || '%'')' ).extract ('ROWSET/ROW/*') ) ) t 14 ORDER BY "Table" 15 / Searchword Table Column ----------- -------------- -------------- KING EMP ENAME SQL> 
  • एक NUMERIC प्रकार खोजें

चलो SCOTT स्कीमा में 20 मान की तलाश करें।

 SQL> variable val NUMBER SQL> exec :val := 20 PL/SQL procedure successfully completed. SQL> SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword", 2 SUBSTR (table_name, 1, 14) "Table", 3 SUBSTR (column_name, 1, 14) "Column" 4 FROM cols, 5 TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select ' 6 || column_name 7 || ' from ' 8 || table_name 9 || ' where upper(' 10 || column_name 11 || ') like upper(''%' 12 || :val 13 || '%'')' ).extract ('ROWSET/ROW/*') ) ) t 14 ORDER BY "Table" 15 / Searchword Table Column ----------- -------------- -------------- 20 DEPT DEPTNO 20 EMP DEPTNO 20 EMP HIREDATE 20 SALGRADE HISAL 20 SALGRADE LOSAL SQL> 

मैं ऐसा कुछ करूँगा (सभी चुनता है जिसे आप की आवश्यकता होती है)। आप बाद में उन्हें sqlplus पर फ़ीड कर सकते हैं:

 echo "select table_name from user_tables;" | sqlplus -S user/pwd | grep -v "^--" | grep -v "TABLE_NAME" | grep "^[AZ]" | while read sw; do echo "desc $sw" | sqlplus -S user/pwd | grep -v "\-\-\-\-\-\-" | awk -F' ' '{print $1}' | while read nw; do echo "select * from $sw where $nw='val'"; done; done; 

यह पैदावार देता है:

 select * from TBL1 where DESCRIPTION='val' select * from TBL1 where ='val' select * from TBL2 where Name='val' select * from TBL2 where LNG_ID='val' 

और यह क्या करता है – प्रत्येक user_tables से प्रत्येक फ़ील्ड ( user_tables से) प्राप्त करें और तालिका से एक चयन * बनाएं जहां फ़ील्ड बराबर 'वेल' है।

यहां एक और संशोधित संस्करण दिया गया है जो कि कम ऑस्टस्ट्रिंग मैच की तुलना करेगा। यह ओरेकल 11 जी में काम करता है

 DECLARE match_count INTEGER; -- Type the owner of the tables you are looking at v_owner VARCHAR2(255) :='OWNER_NAME'; -- Type the data type you are look at (in CAPITAL) -- VARCHAR2, NUMBER, etc. v_data_type VARCHAR2(255) :='VARCHAR2'; -- Type the string you are looking at v_search_string VARCHAR2(4000) :='%lower-search-sub-string%'; BEGIN FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and data_type = v_data_type) LOOP EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||t.table_name||' WHERE lower('||t.column_name||') like :1' INTO match_count USING v_search_string; IF match_count > 0 THEN dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count ); END IF; END LOOP; END; / 

अगर हम तालिका और कॉलम के नाम जानते हैं, लेकिन हर स्कीमा के लिए दिखने वाली स्ट्रिंग की संख्या जानना चाहते हैं:

 Declare owner VARCHAR2(1000); tbl VARCHAR2(1000); cnt number; ct number; str_sql varchar2(1000); reason varchar2(1000); x varchar2(1000):='%string_to_be_searched%'; cursor csr is select owner,table_name from all_tables where table_name ='table_name'; type rec1 is record ( ct VARCHAR2(1000)); type rec is record ( owner VARCHAR2(1000):='', table_name VARCHAR2(1000):=''); rec2 rec; rec3 rec1; begin for rec2 in csr loop --str_sql:= 'select count(*) from '||rec.owner||'.'||rec.table_name||' where CTV_REMARKS like '||chr(39)||x||chr(39); --dbms_output.put_line(str_sql); --execute immediate str_sql execute immediate 'select count(*) from '||rec2.owner||'.'||rec2.table_name||' where column_name like '||chr(39)||x||chr(39) into rec3; if rec3.ct <> 0 then dbms_output.put_line(rec2.owner||','||rec3.ct); else null; end if; end loop; end; 

मैंने तेजी से निष्पादन के लिए प्रत्येक तालिका के प्रत्येक कॉलम के बजाय प्रत्येक तालिका के लिए एक बार निष्पादित करने के लिए बाढ़ की स्क्रिप्ट को संशोधित किया। इसमें ओरेकल 11 जी या उससे अधिक की आवश्यकता है

  set serveroutput on size 100000 declare v_match_count integer; v_counter integer; -- The owner of the tables to search through (case-sensitive) v_owner varchar2(255) := 'OWNER_NAME'; -- A string that is part of the data type(s) of the columns to search through (case-insensitive) v_data_type varchar2(255) := 'CHAR'; -- The string to be searched for (case-insensitive) v_search_string varchar2(4000) := 'FIND_ME'; -- Store the SQL to execute for each table in a CLOB to get around the 32767 byte max size for a VARCHAR2 in PL/SQL v_sql clob := ''; begin for cur_tables in (select owner, table_name from all_tables where owner = v_owner and table_name in (select table_name from all_tab_columns where owner = all_tables.owner and data_type like '%' || upper(v_data_type) || '%') order by table_name) loop v_counter := 0; v_sql := ''; for cur_columns in (select column_name from all_tab_columns where owner = v_owner and table_name = cur_tables.table_name and data_type like '%' || upper(v_data_type) || '%') loop if v_counter > 0 then v_sql := v_sql || ' or '; end if; v_sql := v_sql || 'upper(' || cur_columns.column_name || ') like ''%' || upper(v_search_string) || '%'''; v_counter := v_counter + 1; end loop; v_sql := 'select count(*) from ' || cur_tables.table_name || ' where ' || v_sql; execute immediate v_sql into v_match_count; if v_match_count > 0 then dbms_output.put_line('Match in ' || cur_tables.owner || ': ' || cur_tables.table_name || ' - ' || v_match_count || ' records'); end if; end loop; exception when others then dbms_output.put_line('Error when executing the following: ' || dbms_lob.substr(v_sql, 32600)); end; / 

संपूर्ण डेटाबेस खोज करने की प्रक्रिया:

  CREATE or REPLACE PROCEDURE SEARCH_DB(SEARCH_STR IN VARCHAR2, TAB_COL_RECS OUT VARCHAR2) IS match_count integer; qry_str varchar2(1000); CURSOR TAB_COL_CURSOR IS SELECT TABLE_NAME,COLUMN_NAME,OWNER,DATA_TYPE FROM ALL_TAB_COLUMNS WHERE DATA_TYPE in ('NUMBER','VARCHAR2') AND OWNER='SCOTT'; BEGIN FOR TAB_COL_REC IN TAB_COL_CURSOR LOOP qry_str := 'SELECT COUNT(*) FROM '||TAB_COL_REC.OWNER||'.'||TAB_COL_REC.TABLE_NAME|| ' WHERE '||TAB_COL_REC.COLUMN_NAME; IF TAB_COL_REC.DATA_TYPE = 'NUMBER' THEN qry_str := qry_str||'='||SEARCH_STR; ELSE qry_str := qry_str||' like '||SEARCH_STR; END IF; --dbms_output.put_line( qry_str ); EXECUTE IMMEDIATE qry_str INTO match_count; IF match_count > 0 THEN dbms_output.put_line( qry_str ); --dbms_output.put_line( TAB_COL_REC.TABLE_NAME ||' '||TAB_COL_REC.COLUMN_NAME ||' '||match_count); TAB_COL_RECS := TAB_COL_RECS||'@@'||TAB_COL_REC.TABLE_NAME||'##'||TAB_COL_REC.COLUMN_NAME; END IF; END LOOP; END SEARCH_DB; 

वक्तव्य निष्पादित करें

  DECLARE SEARCH_STR VARCHAR2(200); TAB_COL_RECS VARCHAR2(200); BEGIN SEARCH_STR := 10; SEARCH_DB( SEARCH_STR => SEARCH_STR, TAB_COL_RECS => TAB_COL_RECS ); DBMS_OUTPUT.PUT_LINE('TAB_COL_RECS = ' || TAB_COL_RECS); END; 

नमूना परिणाम

 Connecting to the database test. SELECT COUNT(*) FROM SCOTT.EMP WHERE DEPTNO=10 SELECT COUNT(*) FROM SCOTT.DEPT WHERE DEPTNO=10 TAB_COL_RECS = @@EMP##DEPTNO@@DEPT##DEPTNO Process exited. Disconnecting from the database test. 

मैं एसक्यूएल प्रोम्प्ट पर एक साधारण समाधान नहीं करता हूं Howeve वहाँ कुछ उपकरण हैं जैसे toad और पीएल / एसक्यूएल डेवलपर है कि एक GUI है जहां एक उपयोगकर्ता खोज करने के लिए स्ट्रिंग इनपुट कर सकते हैं और यह तालिका / प्रक्रिया / वस्तु जहां यह पाया जाता है लौट जाएगा।

ऐसे कुछ मुफ्त उपकरण हैं जो इस तरह की खोज करते हैं, उदाहरण के लिए, यह एक काम करता है ठीक और स्रोत कोड उपलब्ध है: https://sites.google.com/site/freejansoft/dbsearch

इस उपकरण का उपयोग करने के लिए आपको ओरेकल ओडीबीसी ड्राइवर और एक DSN की आवश्यकता होगी।

– रन पूर्ण – कोई त्रुटि नहीं

  SET SERVEROUTPUT ON SIZE 100000 DECLARE v_match_count INTEGER; v_counter INTEGER; v_owner VARCHAR2 (255) := 'VASOA'; v_search_string VARCHAR2 (4000) := '99999'; v_data_type VARCHAR2 (255) := 'CHAR'; v_sql CLOB := ''; BEGIN FOR cur_tables IN ( SELECT owner, table_name FROM all_tables WHERE owner = v_owner AND table_name IN (SELECT table_name FROM all_tab_columns WHERE owner = all_tables.owner AND data_type LIKE '%' || UPPER (v_data_type) || '%') ORDER BY table_name) LOOP v_counter := 0; v_sql := ''; FOR cur_columns IN (SELECT column_name, table_name FROM all_tab_columns WHERE owner = v_owner AND table_name = cur_tables.table_name AND data_type LIKE '%' || UPPER (v_data_type) || '%') LOOP IF v_counter > 0 THEN v_sql := v_sql || ' or '; END IF; IF cur_columns.column_name is not null THEN v_sql := v_sql || 'upper(' || cur_columns.column_name || ') =''' || UPPER (v_search_string)||''''; v_counter := v_counter + 1; END IF; END LOOP; IF v_sql is null THEN v_sql := 'select count(*) from ' || v_owner || '.' || cur_tables.table_name; END IF; IF v_sql is not null THEN v_sql := 'select count(*) from ' || v_owner || '.' || cur_tables.table_name || ' where ' || v_sql; END IF; --v_sql := 'select count(*) from ' ||v_owner||'.'|| cur_tables.table_name ||' where '|| v_sql; --dbms_output.put_line(v_sql); --DBMS_OUTPUT.put_line (v_sql); EXECUTE IMMEDIATE v_sql INTO v_match_count; IF v_match_count > 0 THEN DBMS_OUTPUT.put_line (v_sql); dbms_output.put_line('Match in ' || cur_tables.owner || ': ' || cur_tables.table_name || ' - ' || v_match_count || ' records'); END IF; END LOOP; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line ( 'Error when executing the following: ' || DBMS_LOB.SUBSTR (v_sql, 32600)); END; / 

कोड को संशोधित करने के लिए केस-असंवेदनशील तरीके से सटीक मिलानों की जगह लीख क्वेरी का उपयोग करें …

 DECLARE match_count INTEGER; -- Type the owner of the tables you want to search. v_owner VARCHAR2(255) :='USER'; -- Type the data type you're looking for (in CAPS). Examples include: VARCHAR2, NUMBER, etc. v_data_type VARCHAR2(255) :='VARCHAR2'; -- Type the string you are looking for. v_search_string VARCHAR2(4000) :='Test'; BEGIN dbms_output.put_line( 'Starting the search...' ); FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and data_type = v_data_type) LOOP EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||t.table_name||' WHERE LOWER('||t.column_name||') LIKE :1' INTO match_count USING LOWER('%'||v_search_string||'%'); IF match_count > 0 THEN dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count ); END IF; END LOOP; END; 

उधार लेना, थोड़ा सा बढ़ाने और इस ब्लॉग से सरल करने के बाद निम्नलिखित सरल एसक्यूएल कथन काम को काफी अच्छी तरह से कर रहे हैं:

 SELECT DISTINCT (:val) "Search Value", TABLE_NAME "Table", COLUMN_NAME "Column" FROM cols, TABLE (XMLSEQUENCE (DBMS_XMLGEN.GETXMLTYPE( 'SELECT "' || COLUMN_NAME || '" FROM "' || TABLE_NAME || '" WHERE UPPER("' || COLUMN_NAME || '") LIKE UPPER(''%' || :val || '%'')' ).EXTRACT ('ROWSET/ROW/*'))) ORDER BY "Table"; 

@ ललित कुमार के जवाब के लिए मैं निम्नलिखित मुद्दों पर था,

 ORA-19202: Error occurred in XML processing ORA-00904: "SUCCESS": invalid identifier ORA-06512: at "SYS.DBMS_XMLGEN", line 288 ORA-06512: at line 1 19202. 00000 - "Error occurred in XML processing%s" *Cause: An error occurred when processing the XML function *Action: Check the given error message and fix the appropriate problem 

समाधान है:

 WITH char_cols AS (SELECT /*+materialize */ table_name, column_name FROM cols WHERE data_type IN ('CHAR', 'VARCHAR2')) SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword", SUBSTR (table_name, 1, 14) "Table", SUBSTR (column_name, 1, 14) "Column" FROM char_cols, TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select "' || column_name || '" from "' || table_name || '" where upper("' || column_name || '") like upper(''%' || :val || '%'')' ).extract ('ROWSET/ROW/*') ) ) t ORDER BY "Table" /