2012-03-16 6 views
7

ja aktualizowania BLOB z dużym górze tekstu i otrzymuję ten błąd:Jak mogę uniknąć błędów "raw variable length long" w SQL Developer?

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

jest jakiś sposób wokół niego?

Tekst ma 2670 znaków, jest konwertowany przez utl_i18n.string_to_raw, jak wyjaśniono w How do I edit BLOBs (containing JSON) in Oracle SQL Developer?, i wszystko w jednym wierszu w zapytaniu.

Aktualizacja: Przedmiotowy obiekt BLOB zawiera już tekst o długości 2 686 znaków, który jest dłuższy niż tekst, który próbuję wstawić.

+0

możliwe duplikat [Jak mogę edytować BLOB (zawierający JSON) w Oracle SQL Developer?] (Http://stackoverflow.com/questions/9218474/how-do-i-edit-blobs-containing- json-in-oracle-sql-developer) –

+1

Uaktualniłem swoją odpowiedź w drugim wątku, dodając nieco bardziej skomplikowane podejście, które jest bardziej elastyczne niż użycie funkcji 'utl_i18n.string_to_raw'. –

Odpowiedz

6

A RAW jest ograniczony do 2000 bajtów. Jeśli twoje dane są dłuższe, musisz je zapisać w postaci CLOB, a następnie przekonwertować CLOB na BLOB, co jest, niestety, nieco bardziej skomplikowane niż funkcja string_to_raw. Coś takiego będzie działało, zakładając, że możesz przypisać cały ciąg do zmiennej CLOB, która powinna działać tak długo, jak długo ciąg ma długość mniejszą niż 32676 bajtów. Jeśli jest dłuższy, musisz napisać do numeru CLOB, a następnie przekonwertować go na BLOB.

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; 
/
+0

To działa, ale dlaczego 'rpad'? Muszę ustawić długość 'rpad' na długość napisu, który wstawiam. Czy istnieje sposób, aby to zrobić, nie używając 'rpad'? – Xonatron

+1

@MatthewDoucette - Nie powinieneś wcale używać 'RPAD'. Po prostu użyłem go w moim przykładzie do wygenerowania ciągu znaków 3200, ponieważ jestem zbyt leniwy, aby wpisać ciąg znaków, i byłoby to trudne, aby sformatować taki ciąg w poście SO. –

+0

Ah, rozumiem. Dziękuję bardzo. Świetna pomoc! – Xonatron

0

Domyślam się, że chodzi o to, że dane wstawiane do kolumny są zbyt duże dla typu danych kolumny. Sprawdź wartość, którą próbujesz wstawić do kolumny, a następnie zaktualizuj typ danych kolumny.

+0

Czy jesteś pewien? BLOB zawiera już tekst, który jest większy niż tekst, który próbuję wstawić. Dla mnie to sprawia, że ​​jest to SQL Developer (interfejs), a nie problem z bazą danych. – Xonatron

+0

Może to być związane z maksymalnym limitem 'utl_i18n.string_to_raw', jeśli taki istnieje. – Xonatron

Powiązane problemy