将小型 Oracle 长原始值转换为其他类型

Posted

技术标签:

【中文标题】将小型 Oracle 长原始值转换为其他类型【英文标题】:Converting small-ish Oracle long raw values to other types 【发布时间】:2009-01-08 21:35:48 【问题描述】:

我有一个 Oracle 表,其中包含一个 LONG RAW 类型的字段,该字段包含 ASCII 字符数据。如何编写一个查询或视图,将其转换为更容易使用的字符串?这些总是单字节字符,FWIW。

【问题讨论】:

【参考方案1】:

也许

select ...., to_lob(long_raw) from old_table

(http://www.psoug.org/reference/convert_func.html)

UTL_RAW.CAST_TO_VARCHAR2(b) 

(http://www.dbasupport.com/forums/showthread.php?t=5342).

【讨论】:

【参考方案2】:

我找到了这句话:

在 Oracle9i 中,您甚至可以:

alter table old_table modify ( c clob );

转换它。

请看这里:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1037232794454

编辑

varchar2 列的最大长度为 4000。是不是太短了?

【讨论】:

一个现有且相当脆弱的应用程序当前使用此表,因此我宁愿不修改现有表,以免撞倒纸牌屋。【参考方案3】:

我发现这适用于 CLOB 数据类型。我相信 LOB 类型也是如此。

create or replace 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;



INSERT INTO NEWTABLE (NEWCOLUMN) SELECT RTRIM(lob2char(OLDCOLUMN)) FROM OLDTABLE;

【讨论】:

以上是关于将小型 Oracle 长原始值转换为其他类型的主要内容,如果未能解决你的问题,请参考以下文章

引用类型转换为原始值(基本类型)

为啥不能将“UIView”类型的值转换为其他视图?

VB中如何将object类型转换为其他类型?

在逻辑上表示单个值时将类转换为结构,类似于原始类型

将 nvarchar 值转换为数据类型 int 和其他 SQL Server 错误时失败

使用休眠和 Oracle 将 Clob 转换为字符串