2010-02-26 10 views
44

मैंने ओरेकल डेटाबेस में कुछ तालिकाओं तक "केवल पढ़ने" तक पहुंच प्राप्त की है। मुझे कुछ कॉलम पर स्कीमा जानकारी प्राप्त करने की आवश्यकता है। मैं एमएस एसक्यूएल के sp_help के समान कुछ उपयोग करना चाहता हूं।मैं कम विशेषाधिकारों के साथ पीएल-एसक्यूएल के साथ ओरेकल में कॉलम डेटाटाइप कैसे प्राप्त करूं?

मैं मेज मैं इस क्वेरी में सूचीबद्ध में दिलचस्पी रखता हूँ देखें:

SELECT * FROM ALL_TABLES 

जब मैं इस क्वेरी चलाने, ओरेकल मुझसे कहता है "तालिका स्कीमा में नहीं मिला", और हाँ मापदंडों सही हैं।

SELECT 
DBMS_METADATA.GET_DDL('TABLE', 'ITEM_COMMIT_AGG', 'INTAMPS') AS DDL 
FROM DUAL; 

मेरी ओरेकल वैश्विक अनुवादक 9000 उपयोग करने के बाद मैं इस क्योंकि मैं पर्याप्त विशेषाधिकार नहीं है काम नहीं करता है अनुमान लगाया गया है। मेरी बाधाओं को देखते हुए मुझे टेबल पर कॉलम की डेटाटाइप और डेटा लंबाई कैसे मिल सकती है, मैंने पीएल-एसक्यूएल कथन के साथ पहुंच पढ़ी है?

उत्तर

42

ALL_TAB_COLUMNS PL/SQL से queryable होना चाहिए। DESC एक एसक्यूएल * प्लस कमांड है।

SQL> desc all_tab_columns; 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
OWNER          NOT NULL VARCHAR2(30) 
TABLE_NAME        NOT NULL VARCHAR2(30) 
COLUMN_NAME        NOT NULL VARCHAR2(30) 
DATA_TYPE           VARCHAR2(106) 
DATA_TYPE_MOD          VARCHAR2(3) 
DATA_TYPE_OWNER         VARCHAR2(30) 
DATA_LENGTH        NOT NULL NUMBER 
DATA_PRECISION          NUMBER 
DATA_SCALE           NUMBER 
NULLABLE           VARCHAR2(1) 
COLUMN_ID           NUMBER 
DEFAULT_LENGTH          NUMBER 
DATA_DEFAULT          LONG 
NUM_DISTINCT          NUMBER 
LOW_VALUE           RAW(32) 
HIGH_VALUE           RAW(32) 
DENSITY           NUMBER 
NUM_NULLS           NUMBER 
NUM_BUCKETS          NUMBER 
LAST_ANALYZED          DATE 
SAMPLE_SIZE          NUMBER 
CHARACTER_SET_NAME         VARCHAR2(44) 
CHAR_COL_DECL_LENGTH        NUMBER 
GLOBAL_STATS          VARCHAR2(3) 
USER_STATS           VARCHAR2(3) 
AVG_COL_LEN          NUMBER 
CHAR_LENGTH          NUMBER 
CHAR_USED           VARCHAR2(1) 
V80_FMT_IMAGE          VARCHAR2(3) 
DATA_UPGRADED          VARCHAR2(3) 
HISTOGRAM           VARCHAR2(15) 
+5

एक उदाहरण अच्छा होगा। – leanne

+2

@leanne आप इस सारणी का उपयोग इस प्रकार करते हैं: 'SELECT * user_tab_columns से जहां table_name = 'FILL_IN_THE_TABLE_NAME' और column_name = 'FILL_IN_THE_COLUMN_NAME';' – Tenzin

+0

हाँ, @Tenzin - आपके जैसे कई उदाहरण यहां कुछ साल पहले प्रदान किए गए थे, जिनमें शामिल हैं इस पोस्ट को संपादित करें। यदि आप इस उत्तर में 'संपादित ...' पंक्ति पर क्लिक करते हैं, तो आप देखेंगे कि एडम ने बेहतर व्याख्या करने के लिए क्या जोड़ा है। (धन्यवाद, एडम!) – leanne

26

आप desc कमांड का उपयोग कर सकते हैं।

desc MY_TABLE 

यह आपको स्तंभ नाम दे देंगे, चाहे अशक्त वैध है, और डेटाप्रकार (और लंबाई यदि लागू हो)

+0

@akf - यह काम करता है, धन्यवाद। – James

6
select t.data_type 
    from user_tab_columns t 
where t.TABLE_NAME = 'xxx' 
    and t.COLUMN_NAME='aaa' 
+0

अच्छा, मौजूदा स्कीमा 'user_tab_columns' के बाहर मौजूद टेबलों के लिए' all_tab_columns' –

5

ओरेकल:

select data_type || '(' || data_length || ')' 
from user_tab_columns where TABLE_NAME = 'YourTableName' 
14

नोट:: अपनी तालिका में पूर्ण डेटाप्रकार की एक सूची प्राप्त करता है, तो आपको लगता है कि एक अलग स्कीमा में हैं तालिकाओं के लिए इस जानकारी को प्राप्त करने के लिए कोशिश कर रहे हैं all_tab_columns दृश्य का उपयोग करें, हमें यह समस्या है क्योंकि हमारे अनुप्रयोग सुरक्षा उद्देश्यों के लिए एक अलग SCHEMA का उपयोग करते हैं।

ईजी:

निम्न का उपयोग

SELECT 
    data_length 
FROM 
    all_tab_columns 
WHERE 
    upper(table_name) = 'MY_TABLE_NAME' AND upper(column_name) = 'MY_COL_NAME' 
13

सबसे अच्छा समाधान है कि मैं इस तरह के मामले के लिए मिल गया है

select column_name, data_type|| 
case 
when data_precision is not null and nvl(data_scale,0)>0 then '('||data_precision||','||data_scale||')' 
when data_precision is not null and nvl(data_scale,0)=0 then '('||data_precision||')' 
when data_precision is null and data_scale is not null then '(*,'||data_scale||')' 
when char_length>0 then '('||char_length|| case char_used 
                 when 'B' then ' Byte' 
                 when 'C' then ' Char' 
                 else null 
              end||')' 
end||decode(nullable, 'N', ' NOT NULL') 
from user_tab_columns 
where table_name = 'TABLE_NAME' 
and column_name = 'COLUMN_NAME'; 

@Aaron Stainback है, सुधार के लिए धन्यवाद!

+1

'के साथ प्रतिस्थापित किया जा सकता है, आपको CHAR_USED में जोड़ना होगा ताकि आप यह बता सकें कि इसे varchar2 –

+0

जैसे कुछ में बाइट या चार के रूप में परिभाषित किया गया था, यह अच्छा है कोड, लेकिन आईएनटी फ़ील्ड के मामले में यह "NUMBER (*, 0)" लौटाता है इसे कुछ सुधार की आवश्यकता है –

+0

@ फ़िरसनिज़म इसे आजमाएं - शायद मैं आपको सही ढंग से समझ नहीं पा रहा हूं लेकिन जब डेटा_स्केल 0 है तो यह NUMBER (*) देता है, जब यह है! = 0 तो यह NUMBER (*, data_scale) देता है – sev3ryn

2
select column_name, data_type || '(' || data_length || ')' as datatype 
from all_tab_columns 
where TABLE_NAME = upper('myTableName') 
1

त्वरित और गंदा तरीका (जैसे कैसे डेटा ओरेकल में संग्रहित है देखने के लिए),

SQL> select dump(dummy) dump_dummy, dummy 
    , dump(10) dump_ten 
from dual 

DUMP_DUMMY  DUMMY DUMP_TEN    
---------------- ----- -------------------- 
Typ=1 Len=1: 88 X  Typ=2 Len=2: 193,11 
1 row selected. 

तालिका sys.dual में डमी स्तंभ typ = 1 (varchar2) को दिखाया जाता है 10 है, जबकि टाइप = 2 (संख्या)।

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