web-dev-qa-db-fra.com

Comment convertir CLOB en VARCHAR2 dans Oracle pl/sql

J'ai une variable clob, besoin de l'affecter à la variable varchar2. Les données contenues dans clob var sont inférieures à 4000 (i..e maxsize de varchar2) Oracle10 +

J'ai essayé 

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

mais cela transforme le rapport en valeur longue que je vois pendant le débogage. Aussi, quand j'appelle ce sql (proc) à partir de mon code C #. Il se plaint de dire que le tampon est trop petit, parce que j'envoie un paramètre conformément à varchar, mais la conversion ci-dessus risque de le transformer en valeur longue.

J'ai même essayé la cession directe

   report_clob := report 

obtenir le même résultat.

MODIFIER

Ok, pour répondre aux questions ci-dessous, veuillez consulter: Je débogue en utilisant le script de test dans le développeur PL/SQL. la variable de rapport est varchar2 (4000). Quand j'arrive après la 2e ligne. Le rapport indique une valeur longue et indique simplement (Valeur longue). ne peux même pas voir le contenu.

report et report_clob sont des variables sortantes de la procédure. Cette procédure est appelée à partir de code C #.

Il existe un tampon de chaîne d'exception trop petit en C # lorsque j'appelle cette procédure. J'ai donné 5000 en tant que taille de la variable de rapport en C # suffisante pour recevoir une valeur de 4000 caractères maximum de la procédure. Donc, je suppose que le problème ne réside pas là.

Et quand j'assigne le rapport: = 'une chaîne ....', l'appel C # fonctionne bien.

Mon enquête indique donc que report: = transform (report_clob) rend report la valeur longue ou quelque chose du genre (bizarre), ce qui rend le code C # problématique pour traiter une valeur plus grande dans le paramètre 5000 varchar out.

Plus de détails, je serai heureux de fournir.

9
Munish Goyal

Citation (lire ici ) -

Lorsque vous utilisez CAST pour convertir une valeur CLOB en un type de données caractère ou une valeur BLOB dans le type de données RAW, la base de données implicitement convertit la valeur LOB en caractères ou en données brutes, puis explicitement jette la valeur résultante dans le type de données cible.

Donc, quelque chose comme ça devrait marcher.

report := CAST(report_clob AS VARCHAR2);

Ou mieux encore, utilisez-le comme CAST(report_clob AS VARCHAR2) partout où vous essayez d'utiliser BLOB comme VARCHAR

7
Annjawn

Conversion de VARCHAR2 en CLOB

En PL/SQL, un CLOB peut être converti en VARCHAR2 avec une simple affectation, SUBSTR et d'autres méthodes. Une affectation simple ne fonctionnera que si le CLOB est inférieur ou égal à la taille du VARCHAR2. La limite est 32767 en PL/SQL et 4000 en SQL (bien que 12c autorise 32767 en SQL).

Par exemple, ce code convertit un petit CLOB en une simple affectation, puis couvre le début d'un CLOB plus grand.

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;

LONGUE?

Le code ci-dessus ne convertit pas la valeur en LONG. Cela ressemble simplement à cela à cause des limitations des débogueurs PL/SQL et des chaînes de plus de 999 caractères.

Par exemple, dans PL/SQL Developer, ouvrez une fenêtre de test et ajoutez et déboguez le code ci-dessus. Cliquez avec le bouton droit sur v_varchar2 et sélectionnez "Ajouter une variable aux montres". Parcourez le code et la valeur sera réglée sur "(Valeur longue)". Il y a un ... à côté du texte mais il n’affiche pas le contenu .PLSQL Developer Long Value

C #?

Je soupçonne que le vrai problème ici est avec C #, mais je ne sais pas assez sur C # pour résoudre le problème.

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

Ceci est mon approximation:

  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