2012-10-12 25 views
5

के अंदर कैसे परिवर्तित करें मेरे पास क्लोब वैरिएबल है, इसे varchar2 चर को असाइन करने की आवश्यकता है। CLOB वर के अंदर डेटा कम से कम 4000 (i..e varchar2 के MAXSIZE) oracle10 +सीएलओबी से VARCHAR2 को ऑरैकल पीएल/एसक्यूएल

मैं

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

कोशिश की, लेकिन यह लंबे समय मूल्य जबकि डिबगिंग जो मैं देख रहा हूँ में रिपोर्ट बदल जाता है। इसके अलावा जब मैं अपने सी # कोड से इस एसक्यूएल (proc) को कॉल करता हूं। यह बफर को बहुत छोटा कहता है, क्योंकि मैं वर्कर के अनुसार पैरामीटर भेजता हूं, लेकिन उपर्युक्त रूपांतरण इसे लंबे मूल्य में बदल सकता है।

मैं भी सीधा काम

report_clob := report 

एक ही परिणाम हो रही है की कोशिश की। PL/SQL डेवलपर में मैं परीक्षण स्क्रिप्ट का उपयोग डिबग:

संपादित

ठीक है, नीचे कृपया देखें सवालों के जवाब देने। रिपोर्ट वैरिएबल varchar2 (4000) है। जब मैं दूसरी पंक्ति के बाद कदम। रिपोर्ट एक लंबा मूल्य साबित होती है और यह केवल कहती है (लंबी मान)। सामग्री भी देख नहीं सकते हैं।

रिपोर्ट और report_clob प्रक्रिया से बाहर परिवर्तनीय हैं। इस प्रक्रिया को सी # कोड से बुलाया जाता है।

जब मैं इस प्रक्रिया को कॉल करता हूं तो सी # में अपवाद स्ट्रिंग बफर बहुत छोटा होता है। मैंने प्रक्रिया से 4000 अधिकतम वर्ण मान प्राप्त करने के लिए पर्याप्त सी # में रिपोर्ट वैरिएबल के आकार के रूप में 5000 दिया है। तो मुझे लगता है कि समस्या वहां झूठ नहीं बोलती है।

और जब मैं रिपोर्ट असाइन करता हूं: = 'कुछ स्ट्रिंग ....' तो सी # कॉल ठीक काम करता है।

तो मेरी जांच में कहा गया है कि रिपोर्ट: = ट्रांसफॉर्म (report_clob) रिपोर्ट को लंबे मूल्य या कुछ ऐसी चीज (अजीब) बन रही है जो 5000 वर्कर आउट पैरामीटर में बड़े मूल्य को संभालने के लिए सी # कोड समस्याग्रस्त बनाता है।

कोई और विवरण मुझे प्रदान करने में खुशी होगी।

+0

'रिपोर्ट' घोषित कैसे किया जाता है? 'लंबा' या 'वचर 2'? आप डिबगिंग कैसे कर रहे हैं, और आप मान को 'C#' - फ़ंक्शन रिटर्न या आउटपुट पैरामीटर पर कैसे लौट रहे हैं, और यह किस प्रकार का है? –

+0

'रिपोर्ट: = सीएएसटी (report_clob एएस VARCHAR2 (3 9 99)); ' – Annjawn

+1

' DBMS_LOB.substr' एक VARCHAR2 देता है, आपको 'TO_CHAR' फ़ंक्शन की आवश्यकता नहीं है। इसके अलावा आप एक लंबा मूल्य क्या कहते हैं? आप डीबग कैसे करते हैं? आपको वास्तव में क्या त्रुटि त्रुटि मिल रही है (यानी ओरेकल या सी #)? रिपोर्ट चर घोषित कैसे किया जाता है? –

उत्तर

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-00,103: आई प्रतीक "(" निम्न में से एक है जब उम्मीद:। ) @% पंक्ति: 688 पाठ: रिपोर्ट: = कास्ट (report_clob एएस VARCHAR2 (3 9 99)); –

+0

@MunishGoyal ने उत्तर को अपडेट किया। – Annjawn

0

यह मेरा अपरिवर्तना है:

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 एक साधारण असाइनमेंट, substr, और अन्य तरीकों के साथ एक VARCHAR2 में बदला जा सकता। एक सरल असाइनमेंट केवल तभी काम करेगा जब सीएलओबी कम या उसके बाद VARCHAR2 के आकार के बराबर हो। पीएल/एसक्यूएल में 32767 और SQL में 4000 की सीमा है (हालांकि 12 सी एसक्यूएल में 32767 की अनुमति देता है)।

उदाहरण के लिए, यह कोड एक छोटे से सीएलओबी को एक साधारण असाइनमेंट के माध्यम से परिवर्तित करता है और फिर एक बड़े सीएलओबी की शुरुआत को कवर करता है।

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; 

लंबा?

उपरोक्त कोड मान को एक लंबे समय तक परिवर्तित नहीं करता है। यह केवल पीएल/एसक्यूएल डिबगर्स और 999 अक्षरों से अधिक तारों के साथ सीमाओं के कारण इस तरह दिखता है।

उदाहरण के लिए, पीएल/एसक्यूएल डेवलपर में, एक टेस्ट विंडो खोलें और उपरोक्त कोड जोड़ें और डीबग करें। v_varchar2 पर राइट-क्लिक करें और "घड़ियों में चर जोड़ें" का चयन करें। कोड और मान के माध्यम से कदम "(लंबा मूल्य)" पर सेट किया जाएगा। टेक्स्ट के बगल में ... है लेकिन यह सामग्री प्रदर्शित नहीं करता है। PLSQL Developer Long Value

सी #?

मुझे संदेह है कि असली समस्या यहां सी # के साथ है, लेकिन मुझे नहीं पता कि समस्या को डीबग करने के लिए सी # के बारे में कितना पर्याप्त है।

+0

और आप इस निष्कर्ष तक कैसे पहुंच गए कि सीएलओबी के साथ वर्चर रूपांतरण में इसका कोई लेना-देना नहीं है? चूंकि आपने इसे एक उत्तर के रूप में पोस्ट किया है, इसलिए यह समझा सकता है। प्रश्न के पीएल/एसक्यूएल डेवेलियर भाग को संपादित किया गया था और बाद में रखा गया था, मेरा जवाब उस भाग को ध्यान में रखते हुए नहीं दिया गया था (टाइमस्टैम्प देखें)। मूल सवाल यह है- _ जब भी मैं अपने सी # कोड से इस एसक्यूएल (proc) को कॉल करता हूं। यह शिकायत करता है कि बफर बहुत छोटा_ – Annjawn

+0

@Anjjnn इस संशोधित उत्तर को इस बार एक वास्तविक उत्तर के साथ देखें। :) –

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;