2012-01-05 25 views
78

लाने के लिए मैं इस तरह एक तालिका में कॉलम पाने के लिए एक 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 करने के लिए नया हूँ) है, ताकि स्कीमा नाम के बराबर है (तार्किक?)

उत्तर

121

information_schema.COLUMNS के लिए Oracle बराबर, ALL_TAB_COLS वर्तमान उपयोगकर्ता के स्वामित्व तालिकाओं के लिए USER_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 इंजेक्शन को जोखिम देते हैं।

+2

तरह से मैं के माध्यम से databbase पर ध्यान दिए बिना ऐसा करने का एक सामान्य तरीका मिल द्वारा वापस आ जाएगी jdbc .. यहां लिंक के साथ: http://www.kodejava.org/examples/163.html –

+0

मुझे अपनी क्वेरी में 'और virtual_column =' NO'' भी जोड़ना पड़ा। – musicin3d

2

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

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

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

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

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

नोट::

-1

आप जो डीबी 2 में विशिष्ट स्तंभ का उपयोग करता तालिका नामों की सूची प्राप्त करने के लिए नीचे दिए गए क्वेरी का उपयोग कर सकते यहां कॉलम ऐसा नाम है जो आप खोज रहे हैं के साथ COLUMN_NAME बदलें।

+0

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

+1

इस जवाब ने वास्तव में मेरी मदद की। मैं ओरेकल मोड में डीबी 2 का उपयोग कर रहा हूं और यह all_tab_cols का समर्थन नहीं करता है। –

70

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

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName'; 
+21

ध्यान रखें कि ओरेकल केस-संवेदी है। मैं आम तौर पर '... कहां कम (तालिका_नाम) =' mytablename '; 'का उपयोग करता हूं। –

+1

@ user565869 मैं 'जहां निचला (TABLE_NAME) = निचला (' WHATEVER ') 'का उपयोग करता हूं, अन्यथा जब तालिका नाम में कुछ अपरकेस वर्ण होते हैं तो उसे तालिका को –

+0

' SELECT स्तंभ_नाम से नहीं मिलेगा all_tab_cols जहां UPPER (Table_Name) = UPPER ('tablename'); 'बस काम करता है। – user3553260

29

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

desc users 

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

+2

इसमें अधिक अपवॉट क्यों नहीं हैं ?? –

+6

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

+4

अपवॉट्स की कमी से कुछ प्रश्नों के लिए 'desc उपयोगकर्ता' का बुरा जवाब नहीं मिलता है, लेकिन यह _this one_ का अच्छा जवाब नहीं है। – Ehryk

0

मुझे लगता है यह एक 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; 
+0

यह उत्तर पढ़ने के लिए बहुत मुश्किल है। कृपया सुधार करने पर विचार करें। – chharvey

4

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

select COLUMN_NAME from user_tab_columns 
where table_name='test_tbl'; 

2

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

select COLUMN_NAME 
FROM all_tab_columns atc 
WHERE table_name like 'USERS' 
0

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

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 

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

0

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

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

यह सभी कॉलम नामों और डेटा प्रकार

संबंधित मुद्दे