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?
Trả lời
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
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;
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
--------------------------------------------------------------------------------
Đâ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. –
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
Đây phải là câu trả lời được chấp nhận –
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(). –
FOO chắc chắn là một CLOB, và giá trị mặc định là empty_clob() –