(1)Oracle中的函数empty_clob()与empty_blob()
在Oracle中的函数EMPTY_BLOB()和EMPTY_CLOB()返回一个空LOB定位器,该定位器可用于初始化LOB变量,或者在INSERT或UPDATE语句中用于将LOB列或属性初始化为EMPTY。EMPTY表示初始化LOB,但不填充数据。
这两个函数分别对应Oracle中的数据类型CLOB和BLOB。
- CLOB(Character Large Object):
字符大对象Clob 用来存储单字节的字符数据。当oracle数据库当需要存入大数据量(大于4000)时,varchar2不够用,可以使用clob。CLOB使用CHAR来保存数据。 如:保存XML文档。
在PostgreSQL或SQLServer等数据使用text类型;
- BLOB(Binary Large Object):
二进制大对象,是一个可以存储二进制文件的容器。典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)
BLOB就是使用二进制保存数据。 如:保存位图。
这里要明确是用null能够用来初始化lob字段否。
我们在Oracle中有如下表test:
SQL> desc test.test;
Name Null? Type
----------------------------------------- -------- ----------------------------
C1 CLOB
C2 BLOB
C3 VARCHAR2(100)
INSERT INTO test values('','','');
INSERT INTO test values(null,null,null);
INSERT INTO test values(empty_clob(),empty_blob(),'');
其余两行数据需要使用管理工具进行填入,因为sql不能自动转换。我们可以得到如下四条数据:
执行以下SQL来查看长度:
SELECT dbms_lob.getlength(c1) c1_len,dbms_lob.getlength(c2) c2_len,dbms_lob.getlength(c3) ce_len FROM test;
可以看出来,null列的长度是null,不是0。要初始化一个lob字段的值,不能使用null,要使用empty_clob和empty_blob函数。
(2)瀚高数据库中的兼容处理:
那么在postgresql中该如何处理呢?
我们可以分别使用cast('' as text)和cast('' as blob)来处理。如果不想改动代码中的Oracle的函数,则可以创建这两个同名函数:
create or replace function empty_clob( )
returns text
as $$
begin
return cast('' as text);
end;
$$ language plpgsql;
create or replace function empty_blob( )
returns bytea
as $$
begin
return cast('' as blob);
end;
$$ language plpgsql;
我们创建一个表,并插入相关数据:
CREATE TABLE test (
c1 text NULL,
c2 bytea NULL,
c3 varchar NULL
);
INSERT INTO test values('test'::text,'test'::bytea,'test'::varchar);
INSERT INTO test values(null,null,null);
INSERT INTO test values(''::text,''::bytea,''::varchar);
INSERT INTO test values('我们一起爬泰山'::text,'我们一起爬泰山'::bytea,'我们一起爬泰山'::varchar);
数据结果如下:
我们执行以下SQL来查看长度:
select length(c1) c1_len,length(c2) c2_len,length(c3) c3_len from test;
可以看出在瀚高数据库中使用null作为text或blob的初始值也是行不通的。为了值的有效性,也需要使用对应的初始值cast('' as text)和cast('' as blob)或初始函数empty_clob和empty_blob。