it-swarm.com.de

Wie konvertiert man CLOB in VARCHAR2 in Oracle pl/sql

Ich habe eine clob-Variable, muss sie der varchar2-Variablen zuweisen. Die Daten innerhalb von clob var sind kleiner als 4000 (dh varchar2's maxsize) Oracle10 +

Ich habe es versucht 

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

aber es verwandelt den Bericht in einen langen Wert, den ich beim Debuggen sehe. Auch wenn ich diesen sql (proc) von meinem C # -Code aus anrufe. Es beklagt sich, dass der Puffer zu klein ist, da ich den Parameter per varchar sende, die obige Konvertierung jedoch möglicherweise einen langen Wert ergibt.

Ich habe sogar direkte Zuordnung versucht

   report_clob := report 

das gleiche Ergebnis erzielen.

EDIT

Ok, um die unten stehenden Fragen zu beantworten, lesen Sie bitte: Ich debugge mit Testskript im PL/SQL-Entwickler. Berichtsvariable ist varchar2 (4000). Wenn ich nach der zweiten Zeile schritt. Der Bericht zeigt einen langen Wert an und sagt lediglich (Langer Wert). kann nicht einmal den Inhalt sehen.

report und report_clob sind aus der Prozedur heraus variabel. Diese Prozedur wird vom C # -Code aus aufgerufen.

Beim Aufruf dieser Prozedur ist in C # ein Ausnahmefolgepuffer zu klein. Ich habe 5000 als Größe der Berichtsvariablen in C # angegeben, die ausreicht, um den maximalen Wert von 4000 Zeichen aus der Prozedur zu erhalten. Ich glaube, das Problem liegt nicht da.

Und wenn ich report: = 'some string ....' zuweise, funktioniert der C # -Aufruf einwandfrei.

Meine Untersuchung sagt also, dass report: = transform (report_clob) aus dem Bericht einen langen Wert oder etwas (seltsames) macht, was den C # -Code problematisch macht, einen größeren Wert in einem 5000-Varchar-Out-Parameter zu behandeln.

Weitere Details werde ich gerne zur Verfügung stellen.

9
Munish Goyal

Zitat (gelesen hier ) -

Wenn Sie CAST verwenden, um einen CLOB-Wert in einen Zeichendatentyp zu konvertieren oder einen BLOB-Wert in den RAW-Datentyp, implizit die Datenbank konvertiert den LOB-Wert in Zeichen- oder Rohdaten und dann explizit wandelt den resultierenden Wert in den Zieldatentyp um.

So etwas sollte funktionieren

report := CAST(report_clob AS VARCHAR2);

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

7
Annjawn

Konvertieren von VARCHAR2 in CLOB

In PL/SQL kann ein CLOB mit einer einfachen Zuweisung, SUBSTR und anderen Methoden in VARCHAR2 konvertiert werden. Eine einfache Zuweisung funktioniert nur, wenn der CLOB kleiner oder gleich der Größe des VARCHAR2 ist. Die Grenze ist 32767 in PL/SQL und 4000 in SQL (obwohl 12c 32767 in SQL erlaubt).

Dieser Code konvertiert beispielsweise ein kleines CLOB durch eine einfache Zuweisung und deckt dann den Anfang eines größeren CLOBs ab.

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 LONG. Aufgrund von Einschränkungen bei PL/SQL-Debuggern und Zeichenfolgen mit mehr als 999 Zeichen sieht es lediglich so aus.

Öffnen Sie beispielsweise in PL/SQL Developer ein Testfenster, 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. Neben dem Text befindet sich ein ..., der Inhalt wird jedoch nicht angezeigt .PLSQL Developer Long Value

C #?

Ich vermute, das eigentliche Problem liegt hier in C #, aber ich weiß nicht, wie es um C # geht, um das Problem zu beheben.

2
Jon Heller
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;
1
panser

Das ist meine Näherung:

  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;
0
Esneyder