【问题标题】:Inserting BLOB data in DB2 using SQL Query使用 SQL Query 在 DB2 中插入 BLOB 数据
【发布时间】:2015-09-17 07:52:33
【问题描述】:

我陷入了需要通过从 DB2 中的文件系统(Windows 7 上的 DB2 Express C)读取文件来将数据插入到 blob 列中的情况。

我在互联网上的某个地方找到了这个INSERT INTO ... VALUES ( ..., readfile('filename'), ...);,但这里的 readfile 不是内置函数,但我需要使用 UDF(c 语言库)创建它,但这可能不是一个有用的解决方案。

谁能告诉我们如何使用插入命令插入 BLOB 值。

【问题讨论】:

  • DB2 的平台和版本?
  • Windows 7 上的 DB2 Express C
  • 有趣的是,DB2 for i 7.1 有一个 GET_BLOB_FROM_FILE() 函数。但 DB2 for LUW 10.5 似乎没有。
  • DB2 for i 7.1,我没有在这里得到平台名称。是否有任何适用于 Windows 的工作区。能否在ZOS(大型机)上运行
  • 抱歉,DB2 for i 仅作为IBM i 操作系统的集成部分提供,该操作系统仅在 IBM Power 或 PureFlex Systems 上运行,带有 IBM POWER 处理器芯片。

标签: sql db2 blob sql-insert


【解决方案1】:

1) 您可以通过ADMIN_CMD 使用LOADIMPORT。这样,您可以使用 SQL 调用将调用该工具的管理存储过程。 Import 或 Load 可以读取文件,然后将其放在一行中。

您也可以使用临时表来包装此过程,该临时表将从文件中读取二进制数据,将其插入临时表中,然后将其从表中返回。

2) 您可以创建一个用 Java 或 C 实现的外部存储过程或 UDF,它将读取数据,然后将其插入行中。

【讨论】:

【解决方案2】:

我没试过,但是你也可以使用处理 LOB 的内置模块http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.apdv.sqlpl.doc/doc/r0055115.html

这仅在 DB2 LUW 9.7 以后可用

【讨论】:

    【解决方案3】:

    我已经通过使用带有以下查询的 IBM Data Studio 成功地做到了这一点:

    INSERT INTO MY_TABLE (BLOB_COLUMN) values (?);
    

    并从弹出对话框中选择一个文件。

    不知何故,RAD 8 中的相同方法没有显示以相同方式加载 blob 列类型的选项。

    【讨论】:

      【解决方案4】:

      首先,根据IBM docs,DB2 中的所有 LOB 数据除了在表中定义的 LOB 列之外,还必须具有以下对应项。请参阅文档,例如 CREATE 语句。

      1. LOB 表空间(每个分区中的每个 LOB 列一个)
      2. 上述表空间上的辅助表,它指向基表中的 blob 列(同样,每个分区中的每个 LOB 列都有一个)
      3. 辅助表中的唯一索引

      准备好此架构后,您可以运行LOAD 命令,该命令可以与文件路径引用 Blob 内容的其他数据字段一起导入。下面是一个带有 Employees 表的演示:

      数据库表 (示例表)

      CREATE TABLE EMPLOYEES (
         ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
         EMPLOYEE_NUMBER INTEGER,
         EMPLOYEE_NAME VARCHAR(255),
         EMPLOYEE_PIC BLOB(500K)
      );
      

      CSV 文件 (逗号是LOAD 中的默认分隔符,没有标题)

      1234, "John Doe", johndoe.jpg
      5678, "Jane Doe", janedoe.jpg
      ...
      

      DB2 LOAD (对许多其他LOAD parameters 使用默认值的简单版本)

      LOAD FROM "/path/to/file.csv"
        OF DEL
        LOBS FROM /path/to/picture/folder/   --PATH OF BLOB FILES WITH BASENAME IN CSV
                                             --MUST END IN FORWARD SLASH
        MODIFIED BY LOBSINFILE CHARDEL""
        DUMPFILE="/path/to/dump.txt"         --FOR FAILED IMPORTS
        METHOD P (1,2,3)                     --NUMBER REFERENCE OF COLS, OR USE N FOR FIELD NAMES
        MESSAGES "/path/to/messages.txt"     --FOR LOAD COMMAND MESSAGES
        REPLACE INTO "EMPLOYEES"             --REMOVES EXISTING FOR IMPORT, OR USE INSERT TO ADD
        (EMPLOYEE_NUMBER
         EMPLOYEE_NAME,
         EMPLOYEE_PIC);
      

      命令行

      > db2 -tvf "/path/to/load_command.sql"
      
      > db2 "SELECT LENGTH(EMPLOYEE_PIC) FROM EMPLOYEES"
      

      【讨论】:

        【解决方案5】:

        此外,您可以插入 blob 值,将字符转换为其对应的十六进制值:

        CREATE TABLE BLOB_TEST (COL1 BLOB(50));
        INSERT INTO BLOB_TEST VALUES (CAST('test' AS BLOB));
        SELECT COL1 FROM BLOB_TEST;
        DROP TABLE BLOB_TEST;
        

        这给出了这个结果:

        COL1
        -------------------------------------------------------------------------------------------------------
        x'74657374'
        
          1 record(s) selected.
        

        【讨论】:

          【解决方案6】:

          将 JPG 文件插入表的 DB2 SQL 查询

          create table table_name(column_name BLOB) /* BLOB 是数据类型

          插入table_name(column_name)values(blob('c:\data\winter.jpg'))

          c:\data\ 是路径,winter.jpg 是图像名称

          【讨论】:

          • 这保存了文件路径的字节表示,至少在 Windows 7 上的 db2 10.5 上。
          猜你喜欢
          • 2017-05-01
          • 1970-01-01
          • 2013-05-03
          • 2017-03-26
          • 1970-01-01
          • 2018-01-22
          • 2012-03-14
          • 2020-07-08
          • 2011-10-26
          相关资源
          最近更新 更多