轻松处理19c Oracle Multimedia数据类型的问题

2021/4/11 19:32:42

本文主要是介绍轻松处理19c Oracle Multimedia数据类型的问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!


图片

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






这篇关于轻松处理19c Oracle Multimedia数据类型的问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程