2012-10-12 3 views
5

Ich habe eine Clob-Variable, muss es varchar2 Variable zuweisen. Die Daten innerhalb clob var weniger als 4000 (i..e varchar2 des maxsize) oracle10 +Wie man CLOB zu VARCHAR2 innerhalb von Orakel pl/sql konvertiert

I

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

aber es stellt sich Bericht in Long-Wert, die ich sehe, während des Debuggens. Auch wenn ich diese sql (proc) von meinem C# -Code aus anrufe. Es beschwert sich, sagen Puffer zu klein, weil ich Parameter wie Varchar senden, aber die obige Umwandlung könnte es in lange Wert verwandeln.

ich sogar direkte Zuordnung versucht

report_clob := report 

das gleiche Ergebnis zu erzielen.

EDIT

Ok, die unten stehenden Fragen finden Sie zu beantworten: Debug in PL/SQL Entwickler Testskript verwenden. Berichtsvariable ist varchar2 (4000). Wenn ich nach der zweiten Zeile gehe. Der Bericht zeigt einen langen Wert an und sagt nur (Long Value). kann nicht einmal den Inhalt sehen.

Bericht und Bericht_Clob sind Variable aus der Prozedur. Diese Prozedur wird aus C# -Code aufgerufen.

Es gibt einen Ausnahme-String-Puffer zu klein in C#, wenn ich diese Prozedur aufrufen. Ich habe 5000 als Größe der Berichtsvariablen in C# angegeben, die ausreicht, um 4000 Max. Zeichenwerte von der Prozedur zu erhalten. Also ich denke, das Problem liegt nicht dort.

Und wenn ich Bericht zuweisen: = 'eine Zeichenfolge ....' dann funktioniert C# Anruf gut.

Also meine Untersuchung sagt, dass report: = transform (report_clob) macht Bericht zu einem langen Wert oder so etwas (seltsam), die C# -Code problematisch macht, größeren Wert in 5000 Varchar out Parameter zu behandeln.

Weitere Details werde ich gerne zur Verfügung stellen.

+0

Wie wird 'report' deklariert? 'LONG' oder' VARCHAR2'? Wie werden Sie debuggen, und wie geben Sie den Wert an 'C#' - Funktion Rückgabe oder Ausgabeparameter, und welcher Typ ist das? –

+0

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

+1

'DBMS_LOB_str' gibt ein VARCHAR2 zurück, die Funktion' TO_CHAR' wird nicht benötigt. Was nennst du auch einen langen Wert? Wie debuggen Sie? Welchen Nachrichtenfehler erhalten Sie genau (zB Oracle oder C#)? Wie wird die Berichtsvariable deklariert? –

Antwort

5

Zitat (lesen 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.

Also, so etwas wie dieses Werk sollte

report := CAST(report_clob AS VARCHAR2); 

Oder noch besser als CAST(report_clob AS VARCHAR2) verwenden, wo immer Sie versuchen, die BLOB als VARCHAR verwenden

+0

dies gibt Fehler Compilation Fehler für PAKET BODY STAGING.SBX Fehler: PLS-00103: Fand das Symbol "(" wenn erwartet Sie eine der folgenden:. ) @% Line: 688 Text: Bericht: = CAST (report_clob AS VARCHAR2 (3999)); –

+0

@MunishGoyal Die Antwort wurde aktualisiert. – Annjawn

0

Dies ist meine ungefähre Adresse:

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

gibt es eine Person, die -1 an alle setzt. – Esneyder

2

VARCHAR2 Converting

In PL/SQL CLOB CLOB kann mit einer einfachen Zuordnung, SUBSTR und anderen Verfahren auf einen VARCHAR2 umgewandelt werden. Eine einfache Zuweisung funktioniert nur, wenn der CLOB kleiner oder gleich der Größe von VARCHAR2 ist. Das Limit ist 32767 in PL/SQL und 4000 in SQL (obwohl 12c 32767 in SQL erlaubt).

Zum Beispiel konvertiert dieser Code einen kleinen CLOB durch eine einfache Zuweisung und konvertiert dann den Anfang eines größeren CLOB.

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; 

LANG?

Der obige Code konvertiert den Wert nicht in einen LONG. Es sieht nur so aus, weil es Einschränkungen bei PL/SQL-Debuggern und Strings über 999 Zeichen gibt.

Öffnen Sie beispielsweise in PL/SQL Developer ein Testfenster und fügen Sie den obigen Code hinzu und debuggen Sie ihn. Klicken Sie mit der rechten Maustaste auf v_varchar2 und wählen Sie "Variable zu Uhren hinzufügen". Durchlaufen Sie den Code und der Wert wird auf "(Long Value)" gesetzt. Es gibt eine ... neben dem Text, aber es zeigt nicht den Inhalt an. PLSQL Developer Long Value

C#?

Ich vermute, das eigentliche Problem hier ist mit C#, aber ich weiß nicht, wie genug über C#, um das Problem zu debuggen.

+0

Und wie sind Sie zu der Schlussfolgerung gekommen, dass dies nichts mit der Umwandlung von CLOB in Varchar zu tun hat? Da Sie dies als Antwort gepostet haben, könnte es sich auch erklären. Der PL/SQL-Entwickler-Teil der Frage wurde bearbeitet und später eingefügt, so dass meine Antwort nicht gegeben wurde, um diesen Teil zu berücksichtigen (siehe Zeitstempel). Die ursprüngliche Frage ist - _Auch wenn ich dieses sql (proc) von meinem C# Code rufe. es beklagt sich zu sagen, Puffer zu klein_ – Annjawn

+0

@Annjawn Siehe meine überarbeitete Antwort, mit einer tatsächlichen Antwort dieses Mal. :) –

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; 
Verwandte Themen