2012-10-12 799 views
5

Tengo una variable de clob, necesito asignarla a la variable varchar2. Los datos dentro de CLOB var es inferior a 4000 (maxsize i..e de varchar2) oracle10 +Cómo convertir CLOB a VARCHAR2 dentro de oracle pl/sql

Probé

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

pero resulta informe en tiempo de valor, que veo durante la depuración. También cuando llamo a este sql (proc) desde mi código C#. Se queja diciendo que el búfer es demasiado pequeño, porque envío el parámetro como varchar, pero la conversión anterior podría estar convirtiéndolo en un valor largo.

Incluso intenté asignación directa

report_clob := report 

conseguir el mismo resultado.

EDITAR

Ok, para contestar las siguientes preguntas: consulte I depuración mediante escritura de la prueba en PL/SQL Developer. la variable de informe es varchar2 (4000). Cuando paso después de la 2da línea. el informe muestra que tiene un valor largo y solo dice (valor largo). Ni siquiera puedo ver los contenidos.

informe y report_clob son variables del procedimiento. Este procedimiento se llama desde el código C#.

Hay un búfer de cadena de excepción demasiado pequeño en C# cuando llamo a este procedimiento. He dado 5000 como tamaño de variable de informe en C# suficiente para recibir 4000 caracteres como máximo del procedimiento. Así que supongo que el problema no está allí.

Y cuando asigno el informe: = 'some string ....', la llamada C# funciona bien.

Así que mi investigación dice que report: = transform (report_clob) hace que el informe se convierta en un valor largo o algo así (raro) que hace que el código C# sea problemático para manejar un valor mayor en 5000 varchar out parameter.

Más detalles que estaré encantado de proporcionarle.

+0

¿Cómo se declara 'informe'? 'LONG' o' VARCHAR2'? ¿Cómo está depurando, y cómo está devolviendo el valor a 'C#' - función de retorno o parámetro de salida, y qué tipo es eso? –

+0

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

+1

'DBMS_LOB.substr' devuelve un VARCHAR2, no necesita la función' TO_CHAR'. Además, ¿cómo se llama un valor largo? ¿Cómo se depura? ¿Qué mensaje de error está recibiendo exactamente (es decir, Oracle o C#)? ¿Cómo se declara la variable del informe? –

Respuesta

5

Cita (leer 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.

Por lo tanto, algo como esto debería trabajo-

report := CAST(report_clob AS VARCHAR2); 

O mejor aún utilizarlo como CAST(report_clob AS VARCHAR2) donde quiera que se trata de utilizar la BLOB como VARCHAR

+0

esto da errores de compilación de error para el paquete CUERPO STAGING.SBX error: PLS-00103: Encontró el símbolo "(" cuando se esperaba una de las siguientes:. ) @% Línea: 688 texto: Informe: = REPARTO (report_clob AS VARCHAR2 (3999)); –

+0

@MunishGoyal Se ha actualizado la respuesta. – Annjawn

0

Esta es mi aproximación:

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

hay una persona que pone -1 a todos. – Esneyder

2

conversión VARCHAR2 a CLOB

En PL/SQL un CLOB se puede convertir en un VARCHAR2 con una asignación simple, SUBSTR, y otros métodos. Una asignación simple solo funcionará si el CLOB es menor o igual que el tamaño de VARCHAR2. El límite es 32767 en PL/SQL y 4000 en SQL (aunque 12c permite 32767 en SQL).

Por ejemplo, este código convierte un pequeño CLOB a través de una asignación simple y luego encubierta el comienzo de un CLOB más 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; 

LONG?

El código anterior no convierte el valor en LONG. Simplemente se ve de esa manera debido a las limitaciones con depuradores PL/SQL y cadenas de más de 999 caracteres de largo.

Por ejemplo, en PL/SQL Developer, abra una ventana de prueba y agregue y depure el código anterior. Haga clic derecho en v_varchar2 y seleccione "Agregar variable a los relojes". Pase por el código y el valor se establecerá en "(valor largo)". Hay un ... junto al texto, pero no muestra el contenido. PLSQL Developer Long Value

C#?

Sospecho que el verdadero problema aquí es con C#, pero no sé lo suficiente sobre C# para solucionar el problema.

+0

¿Y cómo llegó a la conclusión de que esto no tiene nada que ver con la conversión de CLOB a Varchar? Ya que ha publicado esto como una respuesta, podría explicarlo. La parte de la pregunta sobre el desarrollador PL/SQL fue editada y puesta luego, por lo tanto, mi respuesta no fue dada teniendo en cuenta esa parte (vea las marcas de tiempo). La pregunta original es- _Also cuando llamo a este sql (proc) desde mi código C#. se queja diciendo que el buffer es demasiado pequeño_ – Annjawn

+0

@Annjawn Vea mi respuesta revisada, esta vez con una respuesta real. :) –

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; 
Cuestiones relacionadas