2016-12-20 7 views
6

पर MySQL तालिका की प्रतिलिपि करते समय लंबे डेटाटाइप का अवैध उपयोग मेरे पास एक MySQL और ओरेकल सर्वर है। मुझे समय-समय पर MySQL से ओरेकल सर्वर तक कुछ तालिकाओं की प्रतिलिपि बनाना है और यह एक निर्धारित पीएलएसक्यूएल प्रक्रिया के माध्यम से किया जाता है और इसके लिए मैंने MySQL और Oracle के बीच एक डीबीLINK बनाया है। सब कुछ ठीक काम कर रहा है जब तक मैं एक तालिका जो उदाहरणओएसकल

create table table_to_copy 
as 
select * from [email protected]; 


" Oracle SQL त्रुटि ओरा-00997 अवैध लंबे डेटाप्रकार के उपयोग" त्रुटि

देने शुरू कर दिया कॉपी करने के लिए किया था

मैंने कुछ टिप्पणियां पढ़ी हैं और यह ज्यादातर निहित रूपांतरण की वजह से है और अधिकांश सुझावों को perfo करना था आरएम स्पष्ट to_lob रूपांतरण। लेकिन कुछ भी मैनुअल करना एक व्यवहार्य विकल्प नहीं है।

कृपया ध्यान दें कि

  • काम व्यवस्था ऐसी है मैं MySQL सर्वर के लिए किसी भी उपयोग केवल एक चीज मैं तालिका नाम है की जरूरत नहीं है और DBLINK है। तो मैं केवल चुनिंदा कथन
  • का उपयोग कर डेटा खींच सकता हूं उपर्युक्त मुद्दे के लिए समाधान किसी प्रकार के स्वचालित फ़िक्स में निपटाया जाना चाहिए। ऐसा इसलिए है क्योंकि तालिका प्रतिलिपि के लिए अनुरोध किसी दिए गए बिंदु के रूप में सैकड़ों तालिका हो सकता है और मैन्युअल रूप से ठीक/जांचने के लिए मैं सभी तालिकाओं से नहीं जा सकता।

कृपया मदद करें, आपकी विशेषज्ञ टिप्पणियां मेरे लिए बेहद मूल्यवान हैं।

नोट: यहां कुछ अन्य प्रश्न हैं जो Illegal use of LONG datatype Oracle जैसा दिखते हैं लेकिन उनके पास जो भी मैं ढूंढ रहा हूं उसका समाधान नहीं है।

+2

संभावित डुप्लिकेट [ओआरए -00 997 के लिए वर्कअराउंड: लंबे डेटाटाइप का अवैध उपयोग] (http://stackoverflow.com/questions/29116396/workaround-for-ora-00997-illegal-use-of-long-datatype) – Rene

+0

मैं इसके बारे में पहले और किसी अन्य मुद्दे के समाधान के लिए इसका इस्तेमाल करता था, लेकिन यहां समस्या यह है कि यह इस समय एक टेबल है लेकिन लाइन के नीचे सैकड़ों हो सकते हैं और प्रत्येक तालिका के लिए मैन्युअल फिक्स एक स्वचालित डेटा रीफ्रेश में विशेष रूप से विकल्प नहीं है गतिविधि। –

+2

आपका प्रश्न अब है, मैं डीबी लिंक पर टेबल कॉलम के डेटाटाइप को कैसे निर्धारित करूं और ओरेकल में उन्हें कॉपी करने के लिए गतिशील रूप से कथन कैसे बना सकता हूं। – Rene

उत्तर

0

मुझे सराहना है कि यह देर हो चुकी है, और मेरे पास यह सटीक सेटअप नहीं है। हालांकि, मैंने ओरेकल (11 जीआर 2) से SQL सर्वर (2008R2 और इससे पहले) में जो किया है वह डेटाबेस लिंक के माध्यम से INFORMATION_SCHEMA.COLUMNS को पढ़ना है और फिर पीएल/एसक्यूएल में तत्काल तत्काल करने के लिए गतिशील रूप से एक स्ट्रिंग उत्पन्न करना है।

DECLARE 
    TYPE associative_array IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(50); 

    data_type_tranforms associative_array; 
    dynamicSQL varchar2(32767); 
    column_list varchar2(32767) := ''; 
    expressions varchar2(32767) := ''; 

    FUNCTION apply_transform(column_name VARCHAR2, data_type VARCHAR2) RETURN VARCHAR2 AS 
    transformed VARCHAR2(1000); 
    BEGIN 
    IF data_type_transforms.exists(data_type) THEN 
     transformed := replace(data_type_transforms(data_type),'$$',column_name); 
    ELSE 
     transformed := column_name; 
    END IF; 
    RETURN transformed; 
    END apply_transform; 

    FUNCTION strip_last_character(input VARCHAR2) RETURN VARCHAR2 AS 
    /* Remove the delimiter trailing after the last entry */ 
    BEGIN 
    RETURN SUBSTR(input, 1, LENGTH(input) - 1); 
    END strip_last_character; 

BEGIN 
    data_type_transforms('LONG') := 'to_lob($$)'; 

    FOR col IN (
    SELECT column_name 
     ,data_type 
    FROM [email protected] 
    WHERE table_name = 'TABLE_TO_COPY' 
    ORDER BY ordinal_position 
) LOOP 
    column_list := column_list || col.column_name ||','; 
    expressions := expressions || apply_transform(col.column_name, col.data_type) ||','; 
    END LOOP; 
    dynamicSQL := 'INSERT INTO table_to_copy ('|| 
    strip_last_character(column_list)|| 
    ') SELECT '|| 
    strip_last_character(expressions)|| 
    ' FROM [email protected]'; 

    EXECUTE IMMEDIATE dynamicSQL; 
END; 

मैं सूचकांक एक डेटा प्रकार किया जा रहा है और मूल्य 'to_date(''$$'',''YYYYMMDD'')' की तरह एक अभिव्यक्ति होने के साथ एक PL/SQL में टेम्पलेट्स की एक श्रृंखला रखना सूचकांक द्वारा सरणी, जिसमें से पात्रों $$ स्तंभ के साथ बदल जाते हैं। यदि आपको डेटा प्रकार को पूरी तरह से ड्रॉप करने की आवश्यकता है, जो मैं अक्सर करता हूं, तो मैंने डेटा-प्रकार सरणी में एक खाली स्ट्रिंग डाली है।