【问题标题】:Work with BLOB object in Oracle在 Oracle 中使用 BLOB 对象
【发布时间】:2012-09-29 21:15:58
【问题描述】:

我有一个这样的 SQL 语句-

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

但是当我运行它时,我得到了这个错误-

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。怎么可能?

【问题讨论】:

  • utl_encode.utl_encode - 为什么utl_encode 两次? utl_encode 是一个包,除非你有一个名为 utl_encode 的数据库模式,否则utl_encode.base64_encode 是正确的语法。
  • @Annjawn 两次 - 只是粘贴错误 :) 当然是一次 :)

标签: oracle base64 converter


【解决方案1】:

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

如果您的图像较大,则必须编写自己的函数。这是一个例子:

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;
/

【讨论】:

    【解决方案2】:

    首先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;
    

    更多关于CASTing here

    【讨论】:

    • 已尝试执行:“从 IPHONE.accidentreports 中选择 utl_raw.cast_to_raw(image1) 其中“key”=66”但得到:ORA-06553: PLS-306: 参数数量或类型错误调用“CAST_TO_RAW”06553. 00000 - “PLS-%s: %s” *原因:*操作:第 5 行错误:第 8 列:8
    • 那是因为IMAGE1 不是RAWIMAGE1 的数据类型必须是 RAW 而不是 BLOBCLOB。更新了答案。
    • IMAGE1 是 BLOB,但是为什么 BLOB 不能转换为 base64 或 raw? (不是 PNG 文件是原始图像,它作为 BLOB 对象保存在 DB 中)?
    • BLOB 是二进制大对象。你可以CASTLOBRAW 然后使用BASE64 函数就可以了。如果您注意到我更新的答案,您会在将其传递给函数时看到我 CAST IMAGE1 列。
    猜你喜欢
    • 1970-01-01
    • 2020-03-03
    • 2010-09-27
    • 2016-11-13
    • 2020-03-16
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 2011-02-05
    相关资源
    最近更新 更多