当前位置: 首页 > 知识库问答 >
问题:

Oracle BLOB到base64 CLOB

云承弼
2023-03-14
CREATE TABLE test
(
image BLOB,
imageBase64 CLOB
);

INSERT INTO test(image)
VALUES (LOAD_FILE('/full/path/to/new/image.jpg'));

UPDATE test SET imageBase64 = UTL_ENCODE.base64_encode(image);

commit;

我知道我可以添加函数/存储proc来完成这项工作。性能方面非常重要,所以我问是否有一种方法可以通过直接将数据推入CLOB来克服32K的限制。

共有1个答案

孔阳炎
2023-03-14

从这里得到的这个函数应该做这个工作。

CREATE OR REPLACE FUNCTION base64encode(p_blob IN BLOB)
  RETURN CLOB
-- -----------------------------------------------------------------------------------
-- File Name    : http://oracle-base.com/dba/miscellaneous/base64encode.sql
-- Author       : Tim Hall
-- Description  : Encodes a BLOB into a Base64 CLOB.
-- Last Modified: 09/11/2011
-- -----------------------------------------------------------------------------------
IS
  l_clob CLOB;
  l_step PLS_INTEGER := 12000; -- make sure you set a multiple of 3 not higher than 24573
BEGIN
  FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_blob) - 1 )/l_step) LOOP
    l_clob := l_clob || UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(DBMS_LOB.substr(p_blob, l_step, i * l_step + 1)));
  END LOOP;
  RETURN l_clob;
END;
/

则更新可以看起来像

UPDATE test SET imageBase64 = base64encode(image);

请注意,也许应该使用函数dbms_lob.append来优化函数,而不是连接操作符。如果您有性能问题,请尝试这样做。

 类似资料:
  • 问题内容: 在PHP中,将RGB三元组转换为HSV值的最直接方法是什么? 问题答案:

  • 问题内容: 对于正在编写的程序,我正在使用base64.b64encode(f.read(image))从一台计算机上传输图像,并尝试在接收脚本中读取它而不将其保存到硬盘驱动器中(以最大程度地减少这种情况)处理时间)。我很难弄清楚如何将图像读取到OpenCV中而不将其保存在本地。 这是我发送图像的代码如下所示: 同时,这是接收它的代码。(这在on_message函数中,因为我正在使用MQTT进行传

  • 签到开关状态 获取签到信息 签到 累计签到排行榜 新版签到 签到开关状态 签到应用具有开关性质,管理员可从后台控制签到是否被开启或者关闭,而开关会在「启动信息」接口中提供。提供格式如下: { "checkin": true // Or "checkin": false } 签到金额格式: { "checkin:attach_balance": 0 } 金额为0时表示未配置 但是

  • 实时了解外勤人员位置活动轨迹及分布,出差也可以异地打卡。 开始你的第一次签到 如何签到 打开手机钉钉-工作-签到 签到按钮自动生成签到时间及签到地点 拍照自带时间和地点水印,提交完成签到 签到设置 根据公司要求选择签到相关设置 查看足迹 签到足迹 ● 点击右下角足迹,直观查看团队足迹,根据部门和日期筛选历史签到记录 ● 选择未签到,可以查看未签到人员,对未签到人员Ding一下 ● 点击足迹分布,可

  • 在上课页面的右下侧点击“活动-签到” 选择签到时间(一般为上课时间),点击"开启签到"。 页面跳转,实时显示目前签到人数,并可随时关闭签到。**

  • 我们添加了使用log4J 2的库。X,但我们仍在使用log4J 1。X(主要是因为我们有自己的一些应用程序和记录仪)。我被告知解决方案是发送log4J 2。x到slf4j(使用log4j-to-slf4j,版本2。X),然后slf4j到log4J 1。X,使用slf4j-log4j12,版本1。X. 这就是我刚才所做的,但我仍然得到以下信息: ERROR StatusLogger未找到log4j2

  • 我们已经添加了使用log4j2.x的库,但是我们仍然在使用log4j1.x(主要是因为我们有自己的一些附加程序和记录器的impl)。我被告知,解决方案是将log4j2.x发送到slf4j(使用log4j-to-slf4j,版本2.x),然后将slf4j发送到log4j1.x,使用slf4j-log4j12,版本1.x。 这就是我刚才所做的,但我仍然得到这样的信息: 我希望slf4j使用log4J

  • 问题内容: 我们将使用DTO在表示层之间来回发送数据。我们有像这样的图层: facade appService domain 并且我们使用推土机来帮助我们将实体转换为dto。但是我现在有两个问题: 从实体到dto,我们可以使用推土机,但是从dto到实体,我们可以使用推土机吗?如果是,如何? 我应该在哪里创建实体?在外观或DTOAssembler中? 例如,我必须注册一本书。这本书的实体外观如下: