2012-10-12 26 views
5

Ho una variabile clob, devo assegnarlo alla variabile varchar2. I dati all'interno clob var è inferiore a 4000 (maxsize i..e di varchar2) oracle10 +Come convertire CLOB in VARCHAR2 all'interno di oracle pl/sql

ho provato

report_len := length(report_clob); 
    report  := TO_CHAR(dbms_lob.substr(report_clob, report_len, 1)); 
    report_clob := null; 

ma si scopre report in tempo di valore che vedo durante il debug. Anche quando chiamo questo sql (proc) dal mio codice C#. Si lamenta dicendo buffer troppo piccolo, perché invio parametri come per varchar, ma la conversione sopra potrebbe trasformarla in valore lungo.

Ho anche provato l'assegnazione diretta

report_clob := report 

ottenendo lo stesso risultato.

EDIT

Ok, di rispondere alle seguenti domande si prega di consultare: il debug utilizzando script di test in PL sviluppatore/SQL. la variabile di report è varchar2 (4000). Quando passo dopo la seconda linea. il rapporto mostra un valore lungo e dice semplicemente (valore lungo). non posso nemmeno vedere il contenuto.

report e report_clob sono fuori variabile dalla procedura. Questa procedura è chiamata dal codice C#.

C'è un buffer di stringa di eccezione troppo piccolo in C# quando chiamo questa procedura. Ho dato 5000 come dimensione della variabile di report in C# sufficiente per ricevere 4000 caratteri max dal valore della procedura. Quindi immagino che il problema non si trovi lì.

E quando assegno report: = 'some string ....' quindi la chiamata C# funziona correttamente.

Quindi la mia indagine dice che il rapporto: = transform (report_clob) sta facendo diventare il report un valore lungo o qualcosa del genere (strano) che rende problematico il codice C# per gestire un valore maggiore nel parametro 5000 varchar out.

Qualsiasi altro dettaglio sarò lieto di fornire.

+0

Come viene dichiarato 'report'? 'LONG' o' VARCHAR2'? Come stai facendo il debug, e come stai restituendo il valore a 'C#' - function return o output parameter, e che tipo è? –

+0

'report: = CAST (report_clob AS VARCHAR2 (3999));' – Annjawn

+1

'DBMS_LOB.substr' restituisce un VARCHAR2, non è necessaria la funzione' TO_CHAR'. Inoltre, come si chiama un valore lungo? Come fai il debug? Che errore stai ottenendo esattamente (cioè Oracle o C#)? Come viene dichiarata la variabile del report? –

risposta

5

Citazione (leggere here) -

When you use CAST to convert a CLOB value into a character datatype or a BLOB value into the RAW datatype, the database implicitly converts the LOB value to character or raw data and then explicitly casts the resulting value into the target datatype.

Quindi, qualcosa di simile a questo dovrebbe lavoro-

report := CAST(report_clob AS VARCHAR2); 

O meglio ancora usarlo come CAST(report_clob AS VARCHAR2) dove mai si sta tentando di utilizzare la BLOB come VARCHAR

+0

questo dà errori errore di compilazione per il pacchetto CORPO STAGING.SBX Errore: PLS-00103: incontrato il simbolo "(" quando prevedono uno di quanto segue:. ) @% Linea: 688 Testo: rapporto: = CAST (report_clob AS VARCHAR2 (3999)); –

+0

@MunishGoyal Aggiornamento della risposta. – Annjawn

0

Questo è il mio aproximation:

Declare 
    Variableclob Clob; 
    Temp_Save Varchar2(32767); //whether it is greater than 4000 

    Begin 
    Select reportClob Into Temp_Save From Reporte Where Id=...; 
    Variableclob:=To_Clob(Temp_Save); 
    Dbms_Output.Put_Line(Variableclob); 


    End; 
+1

c'è una persona che mette -1 a tutti. – Esneyder

2

Conversione VARCHAR2 clob

In PL/SQL CLOB può essere convertito in un VARCHAR2 con una semplice assegnazione, SUBSTR, e altri metodi. Un semplice compito funzionerà solo se il CLOB è inferiore o uguale alla dimensione del VARCHAR2. Il limite è 32767 in PL/SQL e 4000 in SQL (anche se 12c consente il 32767 in SQL).

Ad esempio, questo codice converte un piccolo CLOB attraverso una semplice assegnazione e quindi copre l'inizio di un CLOB più grande.

declare 
    v_small_clob clob := lpad('0', 1000, '0'); 
    v_large_clob clob := lpad('0', 32767, '0') || lpad('0', 32767, '0'); 
    v_varchar2 varchar2(32767); 
begin 
    v_varchar2 := v_small_clob; 
    v_varchar2 := substr(v_large_clob, 1, 32767); 
end; 

LUNGO?

Il codice sopra riportato non converte il valore in LUNGO. Sembra semplicemente in questo modo a causa delle limitazioni con i debugger e le stringhe PL/SQL di oltre 999 caratteri.

Ad esempio, in PL/SQL Developer, aprire una finestra di test e aggiungere e eseguire il debug del codice precedente. Fai clic con il tasto destro del mouse su v_varchar2 e seleziona "Aggiungi variabile agli orologi". Passare attraverso il codice e il valore sarà impostato su "(Valore lungo)". C'è un ... accanto al testo ma non visualizza il contenuto. PLSQL Developer Long Value

C#?

Sospetto che il vero problema qui sia con C# ma non so quanto sia sufficiente C# per eseguire il debug del problema.

+0

E come sei arrivato alla conclusione che questo non ha nulla a che fare con la conversione da CLOB a Varchar? Dal momento che hai postato questo come una risposta, potrebbe anche spiegarlo. La parte di domanda di sviluppo PL/SQL della domanda è stata modificata e inserita più tardi, pertanto la mia risposta non è stata presa tenendo in considerazione questa parte (vedere la data e l'ora). La domanda originale è- _ Anche quando chiamo questo sql (proc) dal mio codice C#. si lamenta dicendo buffer troppo piccolo_ – Annjawn

+0

@Annjawn Vedi la mia risposta rivista, con una risposta effettiva questa volta. :) –

0
ALTER TABLE TABLE_NAME ADD (COLUMN_NAME_NEW varchar2(4000 char)); 
update TABLE_NAME set COLUMN_NAME_NEW = COLUMN_NAME; 

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME; 
ALTER TABLE TABLE_NAME rename column COLUMN_NAME_NEW to COLUMN_NAME;