2013-12-20 74 views
-1

我想在oracle 8中将字符串转换为long。我该怎么做?我只有从blob到char的版本。oracle 8将char转换为long/blob

function lob2char(clob_col clob) return varchar2 IS 
buffer varchar2(4000); 
amt BINARY_INTEGER := 4000; 
pos INTEGER := 1; 
l clob; 
bfils bfile; 
l_var varchar2(4000):=''; 
begin 
LOOP 
if dbms_lob.getlength(clob_col)<=4000 THEN 
dbms_lob.read (clob_col, amt, pos, buffer); 
l_var := l_var||buffer; 
pos:=pos+amt; 
ELSE 
l_var:= 'Cannot convert. Exceeded varchar2 limit'; 
exit; 
END IF; 
END LOOP; 
return l_var; 
EXCEPTION 
WHEN NO_DATA_FOUND THEN 
return l_var; 
END; 

在谷歌上找不到任何地方。

+0

为什么你有一列LONG数据类型? 自CLOB于10年前推出以来,LONG数据类型已被弃用。 Oracle不建议您使用LONG数据类型,并且它仅用于支持向后兼容性。 我刚刚在google上搜索了“Oracle转换为clob”并且获得了大量命中...... – Rene

+0

@Rene - 他们仍然在8i上,如果我记得正确的话,它会引入LOB,并且您很惊讶他们'仍然使用LONG?似乎他们的问题最少...... * 8-)我认为他们当时没有得到官方的支持,但移民已经受到鼓励。 –

+0

你的字符串来自哪里 - 它已经是'varchar2'了吗?将字符串值分配给'long'变量或列有什么问题?你展示的代码似乎是不相关的,而且你真的不清楚你想要做什么。 –

回答

1

我不确定你是否过度思考这一点。 A varchar2总是会比longclob小,因此您可以分配您的价值。这是导致问题的另一种方式。你可以做这样的SQL:

insert into t42 (long_val, clob_val) 
values ('any string up to 4000 chars', 'any other string up to 4000 chars'); 

或者从PL/SQL:

declare 
    char_val varchar2(4000); 
begin 
    char_val := 'another string'; 
    insert into t42 (long_val, clob_val) 
    values (char_val, char_val); 
end; 
/

SQl Fiddle演示。我相信在8i中所有的工作都与11g中的一样。

PL/SQL varchar2可以高达32k,仍然可以像这样插入。

+0

是的,我过度思考。我用utl_raw.cast_to_raw('...'),它工作。 – babboon

+0

@babboon - 你将字符数据放入“blob”中?为什么?你应该使用'clob'作为角色数据? –