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;