暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

甲骨文云技术 2021-04-09
1756

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;

                          如何知道自己是否用了Oracle Multimedia数据类型?关注公众号,发送MT0408,获取检查脚本。

                          编辑:殷海英

                          文章转载自甲骨文云技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论