2012-10-12 75 views
5

Tôi có một biến clob, cần phải gán nó vào biến varchar2. Các dữ liệu bên trong clob var nhỏ hơn 4000 (maxsize i..e varchar2 của) oracle10 +Làm thế nào để chuyển đổi CLOB sang VARCHAR2 bên trong oracle pl/sql

tôi đã cố gắng

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

nhưng nó biến báo cáo vào giá trị lâu mà tôi nhìn thấy trong khi gỡ lỗi. Ngoài ra khi tôi gọi sql này (proc) từ mã C# của tôi. Nó phàn nàn nói đệm quá nhỏ, bởi vì tôi gửi tham số theo varchar, nhưng chuyển đổi ở trên có thể biến nó thành giá trị dài.

Tôi thậm chí đã cố gắng phân công trực tiếp

report_clob := report 

nhận được kết quả tương tự.

EDIT

Ok, để trả lời những câu hỏi dưới đây xin vui lòng xem: tôi gỡ lỗi sử dụng kịch bản thử nghiệm trong phát triển PL/SQL. biến báo cáo là varchar2 (4000). Khi tôi bước sau dòng thứ hai. báo cáo cho thấy là một giá trị dài và nó chỉ nói (Giá trị dài). thậm chí không thể xem nội dung.

báo cáo và report_clob biến mất khỏi quy trình. Thủ tục này được gọi từ mã C#.

Có một bộ đệm chuỗi ngoại lệ quá nhỏ trong C# khi tôi gọi thủ tục này. Tôi đã đưa ra 5000 như kích thước của biến báo cáo trong C# đủ để nhận được 4000 ký tự tối đa giá trị từ thủ tục. Vì vậy, tôi đoán vấn đề không nằm ở đó.

Và khi tôi chỉ định báo cáo: = 'một số chuỗi ....' thì cuộc gọi C# hoạt động tốt. Vì vậy, điều tra của tôi nói rằng báo cáo: = transform (report_clob) là làm cho báo cáo trở thành giá trị dài hoặc một số điều như vậy (lạ) mà làm cho mã C# có vấn đề để xử lý giá trị lớn hơn trong tham số 5000 varchar out.

Mọi chi tiết khác tôi sẽ sẵn lòng cung cấp.

+0

'Báo cáo' được khai báo như thế nào? 'LONG' hoặc' VARCHAR2'? Làm thế nào bạn gỡ lỗi, và làm thế nào bạn trả về giá trị cho 'C#' - hàm trả về hoặc tham số đầu ra, và kiểu đó là gì? –

+0

'báo cáo: = CAST (report_clob AS VARCHAR2 (3999));' – Annjawn

+1

'DBMS_LOB.substr' trả về VARCHAR2, bạn không cần hàm' TO_CHAR'. Ngoài ra, bạn gọi một giá trị lâu dài là gì? Làm thế nào để bạn gỡ lỗi? Bạn nhận được thông báo lỗi nào (tức là Oracle hoặc C#)? Biến báo cáo được khai báo như thế nào? –

Trả lời

5

Quote (đọc 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.

Vì vậy, một cái gì đó như thế này nên work-

report := CAST(report_clob AS VARCHAR2); 

Hoặc tốt hơn sử dụng nó như CAST(report_clob AS VARCHAR2) cứ nơi nào bạn đang cố gắng sử dụng BLOB như VARCHAR

+0

này cung cấp cho các lỗi lỗi Compilation cho PACKAGE BODY STAGING.SBX Lỗi: PLS-00.103: gặp biểu tượng "(" khi chờ đợi một trong các cách sau:. ) @% Line: 688 văn bản: Báo cáo: = CAST (report_clob AS VARCHAR2 (3999)); –

+0

@MunishGoyal Đã cập nhật câu trả lời. – Annjawn

0

Đây là giá trị ước lượng của tôi:

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

có một người đặt -1 cho tất cả. – Esneyder

2

Chuyển đổi VARCHAR2 để CLOB

Trong PL/SQL một CLOB có thể được chuyển đổi sang một VARCHAR2 với một nhiệm vụ đơn giản, SUBSTR, và các phương pháp khác. Một nhiệm vụ đơn giản sẽ chỉ hoạt động nếu CLOB nhỏ hơn hoặc bằng với kích thước của VARCHAR2. Giới hạn là 32767 trong PL/SQL và 4000 trong SQL (mặc dù 12c cho phép 32767 trong SQL).

Ví dụ: mã này chuyển đổi một CLOB nhỏ thông qua một bài tập đơn giản và sau đó bao gồm phần đầu của một CLOB lớn hơn.

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?

Mã trên không chuyển đổi giá trị thành LONG. Nó chỉ trông như vậy vì những hạn chế với các trình gỡ rối và chuỗi PL/SQL dài hơn 999 ký tự.

Ví dụ: trong PL/SQL Developer, hãy mở cửa sổ Kiểm tra và thêm và gỡ lỗi mã ở trên. Nhấp chuột phải vào v_varchar2 và chọn "Thêm biến vào Đồng hồ". Bước qua mã và giá trị sẽ được đặt thành "(Giá trị dài)". Có một ... bên cạnh văn bản nhưng nó không hiển thị nội dung. PLSQL Developer Long Value

C#?

Tôi nghi ngờ vấn đề thực sự ở đây là với C# nhưng tôi không biết đủ về C# để gỡ lỗi vấn đề.

+0

Và làm thế nào bạn đạt được kết luận rằng điều này không có gì để làm với CLOB để chuyển đổi Varchar? Vì bạn đã đăng câu trả lời này, nên cũng có thể giải thích nó. Phần develoer PL/SQL của câu hỏi đã được chỉnh sửa và đặt sau đó, câu trả lời của tôi không được đưa vào phần cân nhắc đó (xem dấu thời gian). Câu hỏi ban đầu là- _Ngoài ra khi tôi gọi sql này (proc) từ mã C# của tôi. nó phàn nàn nói rằng bộ đệm quá small_ – Annjawn

+0

@Annjawn Xem câu trả lời sửa đổi của tôi, với một câu trả lời thực tế thời gian này. :) –

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;