स्तंभ नामों को लाने के लिए Oracle क्वेरी


123

इस तरह से एक टेबल से कॉलम पाने के लिए मेरे पास एक mySQL क्वेरी है:

String sqlStr="select column_name 
from information_schema.COLUMNS 
where table_name='users' 
and table_schema='"+_db+"' 
and column_name not in ('password','version','id')"

मैं Oracle 11g डेटाबेस में उपरोक्त क्वेरी कैसे बदल सकता हूँ? मुझे एक स्कीमा निर्दिष्ट करते हुए, कुछ स्तंभों को छोड़कर तालिका 'उपयोगकर्ताओं' के लिए एक परिणाम के रूप में कॉलम नाम प्राप्त करने की आवश्यकता है। अभी मेरे नए टेबलस्पेस में सभी टेबल हैं, तो क्या मैं स्कीमा नाम के स्थान पर टेबलस्पेस नाम निर्दिष्ट करता हूं?

इसके लिए एक सामान्य एचक्यूएल भी है? मेरे नए Oracle डेटाबेस में (मैं Oracle में नया हूं), मेरे पास केवल टेबलस्पेस नाम है, तो क्या यह स्कीमा के बराबर है (तार्किक रूप से?)

जवाबों:


176

के लिए Oracle बराबर information_schema.COLUMNSहै USER_TAB_COLSवर्तमान उपयोगकर्ता के स्वामित्व तालिकाओं के लिए, ALL_TAB_COLSया DBA_TAB_COLSसभी उपयोगकर्ताओं के स्वामित्व में तालिकाओं के लिए।

टेबलस्पेस एक स्कीमा के बराबर नहीं है, न ही आपको टेबलस्पेस नाम प्रदान करना है।

स्कीमा प्रदान करना / उपयोगकर्ता नाम काम का हो यदि आप क्वेरी चाहेगा ALL_TAB_COLSया DBA_TAB_COLSकिसी विशिष्ट उपयोगकर्ता के स्वामित्व तालिकाओं के स्तंभों के लिए। आपके मामले में, मुझे लगता है कि क्वेरी कुछ इस तरह दिखाई देगी:

String sqlStr= "
SELECT column_name
  FROM all_tab_cols
 WHERE table_name = 'USERS'
   AND owner = '" +_db+ "'
   AND column_name NOT IN ( 'PASSWORD', 'VERSION', 'ID' )"

ध्यान दें कि इस दृष्टिकोण के साथ, आप SQL इंजेक्शन को जोखिम में डालते हैं।

संपादित करें: तालिका में बड़े अक्षरों और स्तंभ नामों के रूप में ये आम तौर पर Oracle में अपरकेस हैं; यदि वे अपने आसपास दोहरे उद्धरण चिह्नों के साथ बनाए जाते हैं, तो वे केवल निचले या मिश्रित मामले हैं।


2
वैसे मुझे jdbc के माध्यम से डेटाबेस के बावजूद ऐसा करने का एक सामान्य तरीका मिला .. यहाँ लिंक के साथ: kodejava.org/examples/163.html
pri_dev

मुझे and virtual_column = 'NO'अपनी क्वेरी में भी जोड़ना था ।
म्यूज़िक 3 डी

101

नीचे दिए गए क्वेरी ने मेरे लिए Oracle डेटाबेस में काम किया।

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

26
ध्यान रखें कि ओरेकल केस-सेंसिटिव है। मैं आमतौर पर उपयोग करता हूं ...WHERE LOWER(Table_Name) = 'mytablename';

2
@ user565869 मैं where lower(TABLE_NAME) = lower('WHATEVER')तब उपयोग करूंगा , जब टेबल के नाम में कुछ बड़ा अक्षर होगा तो उसे टेबल भी नहीं मिलेगी
AlexanderD

SELECT column_name FROM all_tab_cols WHERE UPPER(Table_Name) = UPPER('tablename');साथ ही काम करता है।
user3553260

उपयोग करने lower(TABLE_NAME)या upper(TABLE_NAME)तालिका के टेबल स्कैन करने के लिए ओरेकल की आवश्यकता होती है ALL_TAB_COLUMNS, TABLE_NAMEइससे पहले कि यह आपूर्ति की तुलना कर सके सभी मूल्यों को प्राप्त करने के लिए UPPER('MyTableName')। त्वरित परीक्षण में इसने मेरे उद्देश्य के लिए प्रदर्शन को बेकार कर दिया, इसलिए मैं मामले की संवेदनशील तुलना के साथ रहूंगा।
क्रिस मैग्नसन

40

oracle में आप उपयोग कर सकते हैं

desc users

उपयोगकर्ता तालिका में शामिल सभी कॉलम प्रदर्शित करने के लिए


6
... क्योंकि यद्यपि यह 'तालिका के सभी स्तंभों की सूची कैसे प्राप्त करें' के उत्तर का प्रतिनिधित्व करता है, यह उस प्रश्न का उत्तर नहीं देता है जो पूछा गया था: 1) यह एक प्रश्न नहीं है, 2) इसकी सीमा नहीं है / दिए गए कॉलम को फ़िल्टर करें, 3) क्या यह एक परिणाम सेट लौटा रहा है?
एह्रीक

6
अपवित्रता का अभाव desc usersकुछ सवालों का बुरा जवाब नहीं देता है, लेकिन यह इस के लिए एक अच्छा जवाब नहीं है ।
एह्रीक

और क्योंकि यह एक sql क्वेरी नहीं है, बल्कि यह sql * plus कमांड है। अधिक जानकारी के लिए इसे चेकआउट करें: stackoverflow.com/questions/37133666/…
01000001

7

आप यह कोशिश कर सकते हैं: (यह 11g पर काम करता है और यह तालिका से सभी कॉलम नाम लौटाता है, यहाँ test_tbl तालिका का नाम है और user_tab_columns उपयोगकर्ता अनुमति प्राप्त तालिका के कॉलम हैं)

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 


1
USER_TAB_COLUMNSवास्तव में उपयोगकर्ता के स्वामित्व वाली तालिकाओं के स्तंभ हैं, न कि उपयोगकर्ता को दी गई तालिकाओं के।
डेविड फेबर

2

ओरेकल के साथ उपयोग करने की क्वेरी है:

String sqlStr="select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='"+_db+".users' and COLUMN_NAME not in ('password','version','id')"

ऐसे प्रश्नों के लिए HQL के बारे में कभी नहीं सुना। मुझे लगता है कि इससे निपटने के लिए ORM कार्यान्वयन के लिए कोई मतलब नहीं है। ORM एक ऑब्जेक्ट रिलेशनल मैपिंग है, और जो आप देख रहे हैं, वह मेटाडेटा मैपिंग है ... आप HQL का उपयोग नहीं करेंगे, बल्कि इस उद्देश्य के लिए API विधियों का उपयोग करें, या SQL को निर्देशित करें। उदाहरण के लिए, आप JDBC DatabaseMetaData का उपयोग कर सकते हैं ।

मुझे लगता है कि टेबलस्पेस का स्कीमा से कोई लेना-देना नहीं है। AFAIK टेबलस्पेस मुख्य रूप से तार्किक आंतरिक तकनीकी उद्देश्यों के लिए उपयोग किया जाता है जो DBAs को परेशान करना चाहिए। टेबलस्पेस के संबंध में अधिक जानकारी के लिए, ओरेकल डॉक्टर देखें ।


TABLE_NAME='"+_db+".users'असफल हो जायेगी; आपको स्वामी / स्कीमा और तालिका नाम अलग करना होगाALL_TAB_COLUMNS
डेविड फेबर

2

एकमात्र तरीका जो मैं कॉलम नाम प्राप्त करने में सक्षम था, वह निम्नलिखित क्वेरी का उपयोग कर रहा था:

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'


1

मुझे यह Oracle में उपयोगी लगता है:

SELECT 
    obj.object_name, 
    atc.column_name, 
    atc.data_type, 
    atc.data_length 
FROM 
    all_tab_columns atc,
    (SELECT 
        * 
     FROM 
         all_objects
     WHERE 
        object_name like 'GL_JE%'
        AND owner = 'GL'
        AND object_type in ('TABLE','VIEW')   
    ) obj
WHERE 
    atc.table_name = obj.object_name
ORDER BY 
    obj.object_name, 
    atc.column_name;

इस उत्तर को पढ़ना बहुत कठिन है। कृपया सुधार करने पर विचार करें।

क्या होगा अगर एक ही नाम के साथ कई टेबल हों, लेकिन अलग-अलग मालिक?
डेविड फेबर

1

कई मौकों पर, हमें एक स्कीमा में सभी स्तंभों की सूची को तालिका से अलग करने की आवश्यकता होगी। ऐसे मामलों में हम इस जेनेरिक फ़ंक्शन का उपयोग कर सकते हैं जो एक स्ट्रिंग के रूप में अल्पविराम से अलग की गई सूची प्राप्त करते हैं।

CREATE OR REPLACE FUNCTION cols(
    p_schema_name IN VARCHAR2,
    p_table_name  IN VARCHAR2)
  RETURN VARCHAR2
IS
  v_string VARCHAR2(4000);
BEGIN
  SELECT LISTAGG(COLUMN_NAME , ',' ) WITHIN GROUP (
  ORDER BY ROWNUM )
  INTO v_string
  FROM ALL_TAB_COLUMNS
  WHERE OWNER    = p_schema_name
  AND table_name = p_table_name;
  RETURN v_string;
END;
/

तो, क्वेरी से फ़ंक्शन को कॉल करने से सभी कॉलम के साथ एक पंक्ति मिलती है।

select cols('HR','EMPLOYEES') FROM DUAL;

EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID

नोट: LISTAGG यदि सभी स्तंभों की संयुक्त लंबाई 4000वर्णों से अधिक है जो दुर्लभ है, तो विफल हो जाएगी । ज्यादातर मामलों के लिए, यह काम करेगा।


0
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0;-> ध्यान दें, यह क्वेरी परिणाम, परिणाम है। यह अन्य प्रारूपों के लिए निर्यात योग्य है। और, आप क्वेरी परिणाम को Textप्रारूपित करने के लिए निर्यात कर सकते हैं । निर्यात नीचे की तरह दिखता है जब मैंने किया था SELECT * FROM SATURN.SPRIDEN WHERE ROWNUM = 0;:

    "SPRTELE_PIDM" "SPRTELE_SEQNO" "SPRTELE_TELE_CODE" "SPRTELE_ACTIVITY_DATE" "SPRTELE_PHONE_AREA" "SPRTELE_PHONE_NUMBER" "SPRTELE_PHONE_EXT" "SPRTELE_STATUS_IND" "SPRTELE_ATYP_CODE" "SPRTELE_ADDR_SEQNO" "SPRTELE_PRIMARY_IND" "SPRTELE_UNLIST_IND" "SPRTELE_COMMENT" "SPRTELE_INTL_ACCESS" "SPRTELE_DATA_ORIGIN" "SPRTELE_USER_ID" "SPRTELE_CTRY_CODE_PHONE "" SPRTELE_SURROGATE_ID "" SPRTELE_VERSION "" SPRTELE_VPDI_CODE "

  2. DESCRIBE <TABLE_NAME> -> नोट: यह स्क्रिप्ट आउटपुट है।


-1

आप तालिका नामों की सूची प्राप्त करने के लिए नीचे दिए गए क्वेरी का उपयोग कर सकते हैं जो DB2 में विशिष्ट कॉलम का उपयोग करता है:

SELECT TBNAME                
FROM SYSIBM.SYSCOLUMNS       
WHERE NAME LIKE '%COLUMN_NAME'; 

नोट: यहां COLUMN_NAMEउस कॉलम नाम से बदलें जिसे आप खोज रहे हैं।


शायद आपको जवाब देने के लिए DB2 प्रश्नों की तलाश करनी चाहिए? मुझे संदेह है कि ओरेकल की खोज करने वाले किसी व्यक्ति को DB2 उत्तर की आवश्यकता होगी।
रिचर्ड द किवी

1
इस जवाब ने वास्तव में मेरी मदद की। मैं Oracle मोड में DB2 का उपयोग कर रहा हूं और यह all_tab_cols का समर्थन नहीं करता है।
wm_eddie

-1

आप यह कोशिश कर सकते हैं:

'तालिका का नाम' का वर्णन करें

यह सभी कॉलम नाम और डेटा प्रकार लौटाएगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.