2012-10-12 362 views
5

我有一個clob變量,需要將它分配給varchar2變量。 CLOB VAR內的數據小於4000(i..e VARCHAR2的最大範圍)ORACLE10 +如何將CLOB轉換爲VARCHAR2裏面的oracle pl/sql

我試圖

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

但結果報告到長期價值,我邊看邊調試。另外,當我從我的C#代碼調用這個SQL(PROC)。它抱怨說緩衝區太小,因爲我發送參數爲每個varchar,但上面的轉換可能會把它變成長期價值。

我甚至嘗試直接分配

report_clob := report 

得到同樣的結果。

編輯

好,回答下面請看問題:在PL/SQL開發 我調試使用測試腳本。報告變量是varchar2(4000)。當我在第二線之後時。報告顯示是一個長期價值,它只是說(長期價值)。甚至不能看到內容。

report和report_clob從過程中變出。這個過程是從C#代碼調用的。

當我調用此過程時,C#中有一個異常字符串緩衝區太小。我在C#中給出了5000個報表變量的大小,足以從過程中接收4000個最大字符值。所以我想問題不在於此。

而當我分配報告:='一些字符串....',那麼C#調用工作正常。

所以我的調查說,報告:=變換(report_clob)正在使報告變成long值或使5000個varchar輸出參數中處理較大值的C#代碼有問題的一些這樣的事情(怪異)。

更多詳情我將樂意提供。

+0

'report'是如何聲明的? 'LONG'或'VARCHAR2'?你如何調試,以及如何將值返回給'c#' - 函數返回或輸出參數,以及它是什麼類型? –

+0

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

+1

'DBMS_LOB.substr'返回一個VARCHAR2,你不需要'TO_CHAR'函數。還有,你稱之爲長期價值?你如何調試?什麼信息錯誤是你得到(即甲骨文或C#)?報表變量是如何聲明的? –

回答

5

引用(讀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.

所以,這樣的事情應該與工作

report := CAST(report_clob AS VARCHAR2); 

或者更好的使用它作爲CAST(report_clob AS VARCHAR2)在任何你正試圖將BLOBVARCHAR使用

+0

這給封裝集合體STAGING.SBX 錯誤錯誤編譯錯誤:PLS-00103:出現符號 「(」 以下期待當一個: 。)@% 線:688 文字:報告:= CAST (report_clob AS VARCHAR2(3999)); –

+0

@MunishGoyal更新了答案。 – Annjawn

0

這是我的aproximation:

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

有一個人對所有人投入-1。 – Esneyder

2

轉換VARCHAR2到CLOB

在PL/SQL一個CLOB可以被轉換爲一個VARCHAR2用一個簡單的任務,SUBSTR,以及其他方法。只有當CLOB小於或等於VARCHAR2的大小時,才能使用簡單的分配。 PL/SQL中限制爲32767,SQL中限制爲4000(儘管12c允許SQL中使用32767)。

例如,此代碼通過簡單賦值轉換小型CLOB,然後轉換較大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; 

長時間?

上述代碼不會將該值轉換爲LONG。它僅僅是因爲PL/SQL調試器和超過999個字符長度的字符串的限制。

例如,在PL/SQL Developer中,打開一個測試窗口並添加並調試上述代碼。在v_varchar2上單擊鼠標右鍵,然後選擇「將變量添加到手錶」。單步執行代碼並將值設置爲「(Long Value)」。文本旁邊有一個...,但它不顯示內容。 PLSQL Developer Long Value

C#?

我懷疑這裏真正的問題是用C#但我不知道C#有多足以調試問題。

+0

你是如何得出這個與CLOB到Varchar轉換無關的結論?既然你已經發布這個作爲答案,不妨解釋一下。這個問題的PL/SQL開發者部分被編輯並放在後面,我的回答沒有考慮到這個部分(見時間戳)。原來的問題是 - 當我從我的c#代碼調用這個sql(proc)時。它抱怨說緩衝區太小_ – Annjawn

+0

@安妮看到我修改的答案,這次有了實際的答案。 :) –

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;