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.
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
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 .
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.
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;
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;