首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将整个表的blob数据列转换为varchar类型

将整个表的blob数据列转换为varchar类型
EN

Stack Overflow用户
提问于 2021-08-20 01:40:49
回答 1查看 148关注 0票数 0

我有一个包含blob列的表。blob数据是长度为8的char类型,我想将它转换为整个表的8位长度的varchar (通过重新定义表结构或强制转换)。但是,我不想丢失之前存储在其中的任何数据。我正在使用oracle-sql-developer。

我想永久地更改数据类型(不仅仅是select语句)。任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2021-08-20 08:30:32

考虑到BLOB不应用于此目的,一种方法是创建一个函数将blob转换为clob (这是一个字符串)。

为了能够将字符串插入BLOB列,我需要使用utl_cast_to_raw

让我来给你展示

代码语言:javascript
运行
复制
SQL> create table test_blob ( c1 number, c2 blob ) ;

Table created.

SQL> insert into test_blob values ( 1 , utl_cast_to_raw('AAAABBBB') ) ;

1 row created.

SQL> commit ;

Commit complete.

SQL> select * from test_blob ;

        C1
----------
C2
--------------------------------------------------------------------------------
         1
4141414142424242

现在,我们创建一个函数将BLOB转换为CLOB

代码语言:javascript
运行
复制
create or replace function blob_to_char (b blob)
return clob is
  v_clob    clob;
  n         number;
  v_start   pls_integer := 1;
  v_buffer  pls_integer := 32767;
  v_varchar varchar2(32767);
begin
  if (b is null) 
  then
    return null;
  end if;
  if (dbms_lob.getlength(b)=0) 
  then
    return empty_clob();
  end if;
  dbms_lob.createtemporary(v_clob,true);
  for i in 1..ceil(dbms_lob.getlength(b) / v_buffer)
  loop
    v_varchar := utl_raw.cast_to_varchar2(dbms_lob.substr(b, v_buffer, v_start));
    dbms_lob.writeappend(v_clob, length(v_varchar), v_varchar);
    v_start := v_start + v_buffer;
  end loop;
RETURN v_clob;
end blob_to_char;
/

一旦我们有了函数,让我们来检查一下

代码语言:javascript
运行
复制
SQL> select blob_to_char(c2) from test_blob ;

BLOB_TO_CHAR(C2)
--------------------------------------------------------------------------------
AAAABBBB

现在,我们添加一个新列,并使用blob源列将新列更新为varchar

代码语言:javascript
运行
复制
SQL> alter table test_blob add c3 varchar2(8) ;

Table altered.

SQL> update test_blob set c3 = blob_to_char(c2) ;

1 row updated.

SQL> select * from test_blob ;

        C1
----------
C2
--------------------------------------------------------------------------------
C3
----------------
         1
4141414142424242
AAAABBBB
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68856073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档