2012-10-09 188 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; 
/