2016-12-20 13 views
6

'a kopyalarken LONG veri türünün yasa dışı kullanımı Bir MySQL ve bir Oracle sunucum var. Bazı tabloları MySQL'den Oracle sunucusuna düzenli olarak kopyalamam gerekiyor ve bu planlanmış bir PLSQL prosedürü ile gerçekleştiriliyor ve bunun için MySQL ve Oracle arasında bir DBLINK oluşturdum. BenMysql tablosunu Oracle


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

"Uzun veri türü ait oracle sql hata ora-00997 kaçak kullanım" Örnek

hatayı

vermeye başladı bir tablo kopyalamak zorunda kadar her şey iyi çalışıyor

Birkaç yorum okudum ve bu çoğunlukla örtük dönüştürme nedeniyle ve önerilerin çoğu perfo içindi rm açık to_lob dönüşümü. Ancak el ile bir şey yapmak mümkün bir seçenek değildir.

  • çalışma düzeni Ben olsun tek şey tablo adıdır MySQL sunucuya herhangi erişebilir ve dbLink yok böyle olduğuna dikkat edin. Bu nedenle, yalnızca select select deyimini kullanarak veri çekebilirim
  • Yukarıda belirtilen sorunun bir tür otomatik düzeltmede ele alınması gerekir. Bunun nedeni, tablo kopyası isteğinin herhangi bir noktaya göre yüzlerce tablo olabileceğidir ve elle düzeltmek/kontrol etmek için tüm tabloları kullanamıyorum.

Lütfen, uzman görüşlerinizin benim için çok değerli olduğunu yardım edin.

Not: Illegal use of LONG datatype Oracle gibi benzeyebilir burada diğer bazı sorular vardır ama onlar ben ne arıyorum çözüm yok.

+2

[ORA-00997 için geçici çözüm: LONG veri türünün yasa dışı kullanımı] 'nın olası kopyası (http://stackoverflow.com/questions/29116396/workaround-for-ora-00997-illegal-use-of-long-datatype) – Rene

+0

Bu konuda daha önce olsa ve başka bir sorunu çözmek için kullandım ama burada sorun şu anda bu bir tablo var ama satır aşağı yüzlerce olabilir ve her tablo için manuel düzeltme otomatik veri yenileme özel bir seçenek değildir aktivite. –

+2

THen, sorunuzu şimdi, bir DB bağlantısı üzerinden tablo sütunlarının veri türünü ve bunları Oracle'a kopyalamak için dinamik olarak nasıl ifade oluşturacağımı nasıl belirleyebilirim. – Rene

cevap

0

Bunun oldukça geç olduğunu ve bu kesin ayarlarıma sahip olmadığımı takdir ediyorum. Ancak, Oracle (11gR2) 'den SQL Server'a (2008R2 ve öncesi) yaptığım şey, veritabanı bağlantısı üzerinden INFORMATION_SCHEMA.COLUMNS'ı okumak ve PL/SQL'de YÖNETİCİ İMALATI'na dinamik olarak bir dizge oluşturmaktır.

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; 

Bir PL/SQL şablonları bir dizi tutmak indeksi-by dizide, endeks bir veri türü olan ve değer 'to_date(''$$'',''YYYYMMDD'')' gibi bir ifade olmakla hangi column_name ile değiştirilir olsun $$ karakter. Sıklıkla yaptığım bir veri türünü tamamen kapatmanız gerekirse, veri türü dizisine boş bir dize koydum.