2015-01-21 9 views
5

मुझे एक (कम से कम मैंने ऐसा सोचा) सरल कार्य प्राप्त किया है: कॉलमनाम, डेटाटाइप और लंबाई द्वारा 2 टेबल की तुलना केवल सत्यापित करने के लिए कि उनके पास एक ही संरचना है। यह मौजूदा पर्ल स्क्रिप्ट में किया जाना चाहिए जो दो अलग-अलग डेटाबेस से जुड़ रहा है।कहां डीआरबी करते हैं: ओरेकल table_info/column_info से उनकी जानकारी प्राप्त होती है?

सबसे पहले मैंने बस प्रत्येक डेटाबेस user_tab_columns से पूछताछ की और परिणाम की तुलना की। अब मुझे मुश्किल तरीका पता चला है कि user_tab_columns लाइव नहीं है लेकिन तालिका (http://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_4462.htm#REFRN26277) का विश्लेषण करके ताज़ा किया जाना है, जिसे मैं बिना किसी जानकारी के जानता था।

describe वास्तविक तालिका परिभाषा हो जाता है, लेकिन पर्ल्स dbi के माध्यम से काम करने के लिए प्रतीत नहीं होता: Oracle, तो मैं table_info() और column_info() तरीकों पर ठोकर खाई। लेकिन वे अपनी जानकारी कहां से प्राप्त करते हैं? यदि वे सिर्फ *_tab_columns से पूछताछ करते हैं, तो वे मेरे लिए उपयोग नहीं कर रहे हैं।

मैं बस परीक्षण नहीं कर सकता क्योंकि मैंने अभी तक सही पैरामीटर को पारित नहीं किया है। Dbi Documentation का कहना है कि यह डेटाबेस ड्राइवर के अनुसार है। Oracle DBD Documentation मेरे लिए भी बहुत उपयोगी नहीं था, परीक्षण और त्रुटि अब तक सभी ऑब्जेक्ट्स या कुछ भी नहीं मिल रही है।

पल मैं एक पर्ल सिस्टम कॉल के माध्यम से sqlplus के माध्यम से describe को क्रियान्वित करने और उत्पादन को पार्स की सोच रहा हूँ पर .... लेकिन वहाँ है एक बेहतर तरीका हो सकता है।

संपादित करें:

दृश्य के रूप में की उम्मीद है, अगर सही स्तंभ (नीचे टिप्पणी देखें) user_tab_columns काम करता है।

+0

मुझे लगता है कि आपने दस्तावेज़ से कुछ गलत समझा है! user_columns एक सारणी है, जो हमेशा 100% अद्यतित है - ANALYZE के साथ बदलती एकमात्र चीज वे कॉलम हैं जिनमें सांख्यिकीय डेटा शामिल है। लेकिन नाम, प्रकार ... जैसे कॉलम हमेशा डेस्रिब – Falco

+0

एचएम की तरह ही हैं जो मैंने सोचा था, लेकिन: user_tab_columns से column_name, data_type, data_length चुनें जहां table_name = 'MY_TABLE' और column_name = 'MY_COLUMN'; 'मुझे देता है 200 की डेटा लंबाई। चुनें dbms_metadata.get_ddl ('टेबल', 'MY_TABLE') दोहरी से; 'विशेष कॉलम के लिए 50 दिखाता है, 'डेस्क्रिब MY_TABLE' 50 भी दिखाता है। पाठ्यक्रम के उसी सत्र/डीबी-क्लाइंट-विंडो में निष्पादित। वर्चुअल कॉलम के लिए बाइट्स और चार को समेकित करने वाले डेटा लम्बाई मूल्य को गलत व्याख्या करने के बारे में पहले से ही सोचा गया है, लेकिन अन्य सभी स्तंभों के लिए यह फिट बैठता है। – evilive

+0

यदि यह एक वर्चर टेबल है, तो आपको COLUMN: CHAR_LENGTH की तलाश करनी होगी, क्योंकि LENGTH बाइट में आरक्षित लंबाई है, जो यूटीएफ -8 – Falco

उत्तर

3

आपको शायद डीबीडी :: ओरेकल दस्तावेज विशेष रूप से सहायक नहीं मिला हो, लेकिन क्या आपने सोर्स कोड का उपयोग करने पर विचार किया?

यहां table_info() और column_info() का स्रोत है। दोनों subroutines बड़े पैमाने पर एसक्यूएल कथन का निर्माण खर्च करने लगते हैं।

+0

आह धन्यवाद! तो 'column_info' वास्तव में 'all_tab_columns' से पूछताछ करता है और मुझे अब चिंता करने की आवश्यकता नहीं है ... उम्मीद है कि अगली बार जब मैं स्रोत-लिंक के बारे में सोचता हूं :) – evilive

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