2012-10-09 160 views
1

BLOB对象的工作,我有一个像这个 -与甲骨文

select utl_encode.utl_encode.base64_encode(IMAGE1) 
from IPHONE.accidentreports 
where "key" = 66 

的SQL语句但是当我运行它,我得到这个错误 -

ORA-00904: "UTL_ENCODE"."UTL_ENCODE"."BASE64_ENCODE": invalid identifier 
00904. 00000 - "%s: invalid identifier" 
*Cause:  
*Action: 
Error at Line: 2 Column: 8 

我想我BLOB对象转换为BASE64 。它怎么能做到?

+0

'utl_encode.utl_encode' - 为什么'utl_encode'两次? 'utl_encode'是一个包,除非你有一个名为'utl_encode'的数据库模式,这个''utl_encode.base64_encode'是正确的语法。 – Annjawn

+0

@Annjawn两次 - 只是贴上错误:)五言它曾经:) – user1731968

回答

0

所有UTL_ENCODE.BASE64_ENCODE作品在RAW值的二进制表示和功能首先是这样的:

UTL_ENCODE.BASE64_ENCODE (
    r IN RAW) 
RETURN RAW; 

因此,考虑IMAGE1RAW类型:

SELECT UTL_ENCODE.BASE64_ENCODE(CAST(IMAGE1 AS RAW)) --if IMAGE1 is LOB 
    FROM IPHONE.accidentreports 
WHERE "key" = 66; 

更多关于CAST荷兰国际集团here

+0

试图做的事:“从IPHONE.accidentreports其中选择utl_raw.cast_to_raw(图像1)‘钥匙’= 66” 但已经得到: ORA-06553:PLS-306:调用'CAST_TO_RAW'时参数错误或参数类型错误 06553. 00000 - “PLS-%s:%s” *原因: *操作: 错误在行:5列: 8 – user1731968

+0

这是因为'IMAGE1'不是'RAW'。 “IMAGE1”的数据类型必须是“RAW”而不是“BLOB”或“CLOB”。更新了答案。 – Annjawn

+0

IMAGE1是BLOB,但是为什么BLOB无法转换为base64或raw? (不是PNG文件是原始图像,它保存在数据库中作为BLOB对象)? – user1731968

3

由于UTL_ENCODE.BASE64_ENCODE函数适用于RAW,因此它可以在PL/SQL或SQL中的4000字节以下的BLOB中使用,最多32767字节。

如果您的图像较大,您必须编写自己的功能。下面是一个例子:

CREATE OR REPLACE FUNCTION base64_encode_blob (p BLOB) RETURN BLOB IS 
    l_raw RAW(24573); 
    l_base64 RAW(32767); 
    l_result BLOB; 
    l_offset NUMBER := 1; 
    l_amount NUMBER := 24573; 
BEGIN 
    DBMS_LOB.createtemporary(l_result, FALSE); 
    DBMS_LOB.open(l_result, DBMS_LOB.lob_readwrite); 
    LOOP 
     DBMS_LOB.read(p, l_amount, l_offset, l_raw); 
     l_offset := l_offset + l_amount; 
     l_base64 := utl_encode.base64_encode(l_raw); 
     DBMS_LOB.writeappend(l_result, utl_raw.length(l_base64), l_base64); 
    END LOOP; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     RETURN l_result; 
END; 
/