2009-02-06 25 views
12

Các ngây thơ FOO = empty_clob() phàn nàn về các loại không tương thích. Tôi đã thử Googling, nhưng (một lần nữa) có rất ít thành công khi tìm kiếm trợ giúp với Oracle. Cảm ơn.Làm cách nào để kiểm tra xem cột có bằng rỗng_clob() trong Oracle không?

+0

Bạn có chắc chắn rằng FOO là một CLOB và không phải là BLOB? Bạn sẽ gặp lỗi loại không tương thích so sánh CLOB với BLOB-- bạn cần phải so sánh cột BLOB với empty_blob(). –

+0

FOO chắc chắn là một CLOB, và giá trị mặc định là empty_clob() –

Trả lời

8

Nếu bạn đang cố gắng làm việc so sánh trong PL/SQL, bạn chỉ có thể kiểm tra bình đẳng như giải pháp của Igor không

SQL> ed 
Wrote file afiedt.buf 

    1 DECLARE 
    2  dummy clob; 
    3 BEGIN 
    4  dummy := empty_clob(); 
    5  IF dummy = empty_clob() THEN 
    6   dbms_output.put_line('Dummy is empty'); 
    7  ELSE 
    8   dbms_output.put_line('Dummy is not empty'); 
    9  END IF; 
10* END; 
SQL>/
Dummy is empty 

PL/SQL procedure successfully completed. 

Nếu bạn đang cố gắng làm điều này trong SQL, bạn cần sử dụng hàm DBMS_LOB.COMPARE. Cột LOB trong bảng thực sự là một trình định vị LOB (tức là con trỏ), vì vậy điều bạn thực sự quan tâm là giá trị được chỉ ra bởi LOB có thể so sánh được với giá trị được chỉ định bởi trình định vị LOB được trả về bởi hàm EMPTY_CLOB().

SQL> desc bar 
Name          Null? Type 
----------------------------------------- -------- ------------------------ 

FOO            CLOB 

SQL> insert into bar values ('123'); 

1 row created. 

SQL> insert into bar values(empty_clob()); 

1 row created. 

SQL> insert into bar values(empty_clob()); 

1 row created. 

SQL> ed 
Wrote file afiedt.buf 

    1 select count(*) 
    2 from bar 
    3* where dbms_lob.compare(foo, empty_clob()) = 0 
SQL>/

    COUNT(*) 
---------- 
     2 

SQL> ed 
Wrote file afiedt.buf 

    1 select count(*) 
    2 from bar 
    3* where dbms_lob.compare(foo, empty_clob()) != 0 
SQL>/

    COUNT(*) 
---------- 
     1 
3

một cái gì đó như thế này nên làm việc để khởi tạo:

DECLARE 
    dummy clob; 
    dummy2 clob; 
BEGIN 
    dummy := empty_clob(); 
     IF dummy = empty_clob() THEN 
     dummy2 := dummy; 
     END IF; 
END; 
14

Bạn chỉ muốn kiểm tra một CLOB mà không có bất kỳ chiều dài? Trong khi không chính xác những gì bạn yêu cầu, nó về cơ bản giống nhau?

select * 
    from bar 
where dbms_lob.getlength(foo) = 0; 

Đây là thử nghiệm hoàn chỉnh:

SQL> create table bar (foo clob); 

Table created. 

SQL> insert into bar values (empty_clob()); 

1 row created. 

SQL> select * 
    2 from bar 
    3 where dbms_lob.getlength(foo) = 0; 

FOO 
-------------------------------------------------------------------------------- 
+0

Đây là giải pháp thay thế hiện tại, nhưng dường như quá phức tạp đối với một tác vụ đơn giản như vậy. –

1

Một cách đơn giản để kiểm tra CLOBs trống trong sqlplus là để chuyển đổi tất cả các CLOBs để varchar2 (sử dụng chức năng TO_CHAR) trước khi thực hiện kiểm tra:

SELECT * 
    FROM table1 
    WHERE TO_CHAR(table1.column1) IS NULL 
+0

Đây phải là câu trả lời được chấp nhận –

Các vấn đề liên quan