2016-04-19 5 views
1

Ich möchte eine Prozedur in einer BLOB-Spalte speichern, leider kann ich Ihnen den Code nicht anzeigen, aber er enthält 126 Zeilen. Dies ist das Update IAktualisierung einer BLOB-Spalte, ORA-01461: kann einen LONG-Wert nur zum Einfügen in eine LONG-Spalte binden

DECLARE str varchar2(20000); 
BEGIN str :='create or replace A_LONG_PROCEDURE procedure .........'; 
UPDATE tab1 SET report=str 
WHERE reference= 'TER'; 
commit; 
end; 
/

bin mit bekam ich Fehler ORA-01461; can bind a LONG value only for insert into a LONG column

I-Update über versucht .. set ='CREATE OR REPLACE LONG_PROCEDURE ...' ich Fehler 01704 String Litteral zu lange

Wie Erhalten Sie eine lange Prozedur in einen Klecks aktualisieren Säule ?

+0

nur überprüfen, ist meine Antwort klar oder es braucht mehr Erklärung? – Moudiz

+0

versuchen 'declare str tab1.report% type;' –

+0

@FrankOckenfuss Ich habe einen Fehler falsche Art von Ausdruck, der Spaltentyp des Berichts ist Blob – Moudiz

Antwort

1

Dies sollte funktionieren, sollten Spalte clob zu ändern.

DECLARE 
    declare str tab1.report%type; 
BEGIN 
    str:= to_blob(utl_raw.cast_to_raw('create or replace  A_LONG_PROCEDURE...')); 

    UPDATE tab1 SET report=str 
    WHERE reference= 'TER'; 

    commit; 
end; 
/
+0

es funktioniert Dank – Moudiz

0

Sie müssen Spalte Typ CLOB ändern oder CLOB Variable Prozedur Text initialisieren und danach wandeln es in BLOB mit dbms_lob.ConvertToBlob Verfahren vor dem Einsetzen.

Beispiel für Oracle 11g:

Tabelle Setup:

create table lob_sample(
    id   number, 
    clob_field clob, 
    blob_field blob 
); 

insert into lob_sample(id) values(1); 

Code:

declare 
    vSomeLongString varchar2(32767); 
    vClob CLOB;   
    vBlob BLOB; 
begin 

    -- Build sample string from all_objects view 
    for cFill in (
    select object_type||' '||owner||'.'||object_name||'; '||chr(10) sample_string 
    from all_objects 
) loop            

    vSomeLongString := vSomeLongString || cFill.sample_string; 
    if(length(vSomeLongString) > 32000) then exit; end if; 
    end loop;          


    -- String may be directly assigned to CLOB 
    vClob := vSomeLongString; 

    -- And it's possible to simple assign CLOB variable value to CLOB field 
    update lob_sample set clob_field = vClob where id = 1; 

    -- Even, string value may be directly assigned to CLOB field 
    update lob_sample set clob_field = vSomeLongString where id = 1; 

    -- But for BLOB field conversion are needed.  
    -- BLOB is just a set of raw bytes and it may present 
    -- any character set as well as non-text data. 
    dbms_lob.CreateTemporary(vBlob, false);      
    declare 
    vDestOffset integer := 1; 
    vSrcOffset integer := 1; 
    vDefaultCSID number := dbms_lob.default_csid; 
    vLangContext integer := dbms_lob.default_lang_ctx; 
    vWarning  integer; 
    begin    
    dbms_lob.convertToBlob(
     vBlob, vClob, dbms_lob.LobMaxSize, 
     vDestOffset, vSrcOffset, vDefaultCSID, vLangContext, vWarning 
    ); 
    end; 

    update lob_sample set blob_field = vBlob where id = 1; 

    dbms_lob.freetemporary(vBlob); 

end; 
+0

Sie meinen, convert str zu clob? ... können Sie ein Beispiel – Moudiz

Verwandte Themen