2012-03-16 28 views
7

Ben metnin büyük bağlama ile bir BLOB güncelleştiriyorum ve bu hatayı alıyorum: etrafında herhangi bir yoluSQL Developer'da "ham değişken uzunluk çok uzun" hatalarını nasıl önleyebilirim?

SQL Error: ORA-06502: PL/SQL: numeric or value error: raw variable length too long 

var mı?

Metin, utl_i18n.string_to_raw aracılığıyla How do I edit BLOBs (containing JSON) in Oracle SQL Developer? içinde açıklandığı gibi dönüştürülen 2.670 karakter uzunluğundadır ve tümü sorguda bir satırda yer alır.

Güncelleme: Söz konusu BLOB zaten eklemeye çalıştığım metinden daha uzun olan 2,686 karakter uzunluğunda bir metin içeriyor.

+0

olası yinelenen [I Oracle SQL Developer BLOB'ları (JSON içeren) nasıl düzeltebilirim?] (Http://stackoverflow.com/questions/9218474/how-do-i-edit-blobs-containing- json-in-oracle-sql-developer) –

+1

Cevabımı 'utl_i18n.string_to_raw' işlevini kullanarak daha esnek bir şekilde biraz daha karmaşık bir yaklaşım eklemek için diğer iş parçacığı güncelleştirildi. –

cevap

6

2000 bayt ile sınırlıdır. Verileriniz bundan daha uzunsa, bir CLOB içinde saklamanız ve CLOB'u BLOB'a dönüştürmeniz gerekir; bu, ne yazık ki string_to_raw işlevinin biraz daha karmaşık olmasıdır. Bu gibi bir şey, tüm dizeyi, uzunluğu 32676 bayttan daha az olduğu sürece çalışması gereken CLOB değişkenine atayabileceğinizi varsayar. Bundan daha uzunsa, CLOB parçalarına yazmanız ve daha sonra BLOB'a dönüştürmeniz gerekir.

declare 
    l_blob  blob; 
    l_clob  clob := rpad('{"foo": {"id": "1", "value": "2", "name": "bob"}}',3200,'*'); 
    l_amt   integer := dbms_lob.lobmaxsize; 
    l_dest_offset integer := 1; 
    l_src_offset integer := 1; 
    l_csid  integer := dbms_lob.default_csid; 
    l_ctx   integer := dbms_lob.default_lang_ctx; 
    l_warn  integer; 
begin 
    dbms_lob.createTemporary(l_blob, false); 
    dbms_lob.convertToBlob(l_blob, 
          l_clob, 
          l_amt, 
          l_dest_offset, 
          l_src_offset, 
          l_csid, 
          l_ctx, 
          l_warn); 
    update json_data 
    set data = l_blob; 
end; 
/
ait
+0

Bu çalışır, ama neden rpad'? Rpad’in uzunluğunu eklediğim dizenin uzunluğuna ayarlamalıyım. Bunu 'rpad' kullanmadan yapmanın bir yolu var mı? – Xonatron

+1

@MatthewDoucette - 'RPAD' kullanmanız gerekmemelidir. Örneğimde bir 3200 karakter dizisi oluşturmak için kullanıyordum çünkü çok uzun bir dizge yazmak için çok tembelim ve böyle bir dizeyi bir SO postunda biçimlendirmek için bir acı olur. –

+0

Ah, anladım. Çok teşekkür ederim. Harika yardım! – Xonatron

0

Sorunun nedeni, sütuna eklediğiniz verilerin sütunun veri türü için çok büyük olmasıdır. Lütfen sütuna eklemeye çalıştığınız değeri kontrol edin ve ardından sütun veri türünü güncelleyin. Bir RAW

+0

Emin misin? BLOB zaten eklemeye çalıştığım metinden daha büyük bir metin içeriyor. Bana göre, bu bir veritabanı sorunu değil, bir SQL Geliştirici (arayüz) sorunu yapar. – Xonatron

+0

Eğer varsa, utl_i18n.string_to_raw'nın maksimum limiti ile ilgili olabilir. – Xonatron

İlgili konular