轻松处理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;
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;
标签:NAME,IMAGE,Multimedia,数据类型,BLOB,SQL,Oracle,TABLE 来源: https://blog.51cto.com/u_15127541/2698647