Oracle Database 19c发行版中,如何处理Oracle Multimedia的数据类型呢?我们给出两种常用的解决方案,希望对前使用Oracle Multimedia数据类型并计划升级到Oracle Database 19c的客户有所帮助。

我们建议您将multimedia内容存储到secure files lob当中,并使用例如APEX multimedia extension (AME)的软件完成转换动作。详细信息可以参阅MOS文档(Doc ID 2555923.1)。

方案1:在现有表上更新字段

整体思路如下:

  • 备份现有表

  • 添加新的BLOB和Securefile字段

  • 将数据从ORDIMAGE更新到BLOB

  • 将原有字段设定为不可用

  • 将新字段名称更新为原有名称

  • 删除旧字段

在我们下面的例子中,我们做如下设定:

使用到的表
IMAGE_TABLE/IMAGE_TABLE_BKP
带有multimedia数据类型的字段
IMAGE
SECURE BLOB数据类型的字段IMAGE_BLOB

1、对数据表进行备份,来保护原有数据


CREATE TABLE IMAGE_TABLE_BKP AS SELECT * FROM IMAGE_TABLE;

2、添加一个新的Securefile的BLOB字段用于存储原有数据


SQL> ALTER TABLE IMAGE_TABLE ADD (IMAGE_BLOB BLOB) LOB(IMAGE_BLOB) STORE AS SECUREFILE (TABLESPACE MULTI_SF);
TABLE ALTERED.SQL> DESC IMAGE_TABLE
NAME                                      NULL?    TYPE
----------------------------------------- -------- ----------------------------
ID                                                 NUMBER
IMAGE                                              PUBLIC.ORDIMAGE
IMAGE_BLOB                                         BLOB

3、使用原有数据来更新刚刚创建的BLOB类型字段


SQL> UPDATE IMAGE_TABLE I SET I.IMAGE_BLOB=I.IMAGE.SOURCE.LOCALDATA;
2 ROWS UPDATED.
SQL> COMMIT;
COMMIT COMPLETE.

4、将原有字段标记为unused


SQL> ALTER TABLE IMAGE_TABLE SET UNUSED (IMAGE);
TABLE ALTERED.
SQL> DESC IMAGE_TABLE
NAME                                      NULL?    TYPE
----------------------------------------- -------- ----------------------------
ID                                                 NUMBER
IMAGE_BLOB                                         BLOB

5、将新的BLOB字段的名字改为原有字段的名字


SQL> ALTER TABLE IMAGE_TABLE RENAME COLUMN IMAGE_BLOB TO IMAGE;
TABLE ALTERED.
SQL> DESC IMAGE_TABLE
NAME                                      NULL?    TYPE
----------------------------------------- -------- ----------------------------
ID                                                 NUMBER
IMAGE                                              BLOB

6、将原有字段删除


SQL> ALTER TABLE IMAGE_TABLE DROP UNUSED COLUMNS CHECKPOINT 250;
TABLE ALTERED.
SQL> DESC IMAGE_TABLE
NAME                                      NULL?    TYPE
----------------------------------------- -------- ----------------------------
ID                                                 NUMBER
IMAGE                                              BLOB

7、数据转换后,检查数据完整性


SQL>  EXEC CHECK_SPACE_SECFILE('IMAGE_TABLE','MULTI_SF');
SEGMENT BLOCKS = 2072,  BYTES = 16973824
USED BLOCKS = 895,  BYTES = 7331840
EXPIRED BLOCKS = 1102,  BYTES = 9027584
UNEXPIRED BLOCKS = 0,  BYTES = 0
=============================================
PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.


方案2:将数据移动到新表

基本思路如下:

  • 创建一个新表,结构与原表相同,只不过使用BLOB数据类型替换原有ORDIMAGE数据类型。

  • 将原表中的数据插入到新表当中。

在下面例子当中,使用的表和字段说明:

带有MULTIMEDIA数据类型的表
IMAGE_TABLE_BKP
带有MULTIMEDIA数据类型的字段IMAGE
带有BLOB数据类型的表IMAGE_TABLE_BLOB
带有BLOB数据类型的字段IMAGE

1、查看原表情况


SQL> SELECT OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE FROM DBA_TAB_COLUMNS WHERE TABLE_NAME LIKE 'IMAGE_TABLE_BKP';
OWNER                TABLE_NAME           COLUMN_NAME          DATA_TYPE
-------------------- -------------------- -------------------- --------------------
MULTI_SF             IMAGE_TABLE_BKP      IMAGE                ORDIMAGE
MULTI_SF             IMAGE_TABLE_BKP      ID                   NUMBER

2、创建新表


CREATE TABLE IMAGE_TABLE_BLOB (ID NUMBER,IMAGE BLOB) LOB(IMAGE) STORE AS SECUREFILE (TABLESPACE MULTI_SF);SQL> SELECT OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE FROM DBA_TAB_COLUMNS WHERE TABLE_NAME LIKE 'IMAGE_TABLE_BLOB';


OWNER                TABLE_NAME           COLUMN_NAME          DATA_TYPE
-------------------- -------------------- -------------------- --------------------
MULTI_SF             IMAGE_TABLE_BLOB     ID                   NUMBER
MULTI_SF             IMAGE_TABLE_BLOB     IMAGE                BLOB

3、将原表数据插入新表


INSERT INTO IMAGE_TABLE_BLOB SELECT I.ID,I.IMAGE.SOURCE.LOCALDATA  FROM IMAGE_TABLE I;

4、检查新表中的数据


SQL> EXEC CHECK_SPACE_SECFILE('IMAGE_TABLE_BLOB','MULTI_SF');
SEGMENT BLOCKS = 2072,  BYTES = 16973824
USED BLOCKS = 895,  BYTES = 7331840
EXPIRED BLOCKS = 1102,  BYTES = 9027584
UNEXPIRED BLOCKS = 0,  BYTES = 0
=============================================
PL/SQL PROCEDURE SUCCESSFULLY COMPLETED. 

5、如果需要,可以将原表删除,将新表的名称改为原表名称


DROP TABLE IMAGE_TABLE;
RENAME IMAGE_TABLE_BLOB TO IMAGE_TABLE;




©著作权归作者所有:来自51CTO博客作者mob604756ec7b7c的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 【shell】shell脚本实战-awk基本介绍
  2. 第 81 天:NumPy Ndarray 对象及数据类型
  3. python入门教程13-03 (python语法入门之表相关操作)
  4. MySql数据库列表数据分页查询、全文检索API零代码实现
  5. web前端技巧分享:一场由SameSite字段引发的悲剧
  6. 一场由SameSite字段引发的悲剧
  7. Go语言学习9-结构体类型
  8. Python_学习之基础数据类型
  9. Python爬虫进阶必备 | 关于某汽车交易网加密 Cookie 的分析

随机推荐

  1. Android 如何调用MediaPlayer播放视频[状
  2. Flutter开发(十三)—— PageView不一样的Vi
  3. android调整checkbox的大小
  4. Android WebView获取上一个链接的路径
  5. android画图-解锁界面
  6. Android——TabWidget
  7. Android ViewHolder 优化 ListView
  8. Android倒计时器——CountDownTimer
  9. Android 如何加载大图片
  10. 在Android线程中设置控件的值会报错