使用 SQL 查询在 DB2 中插入 BLOB 数据

Inserting BLOB data in DB2 using SQL Query

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

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

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

1) 您可以使用 LOAD or IMPORT via ADMIN_CMD。这样,您就可以使用SQL调用将调用该工具的管理存储过程。 Import 或 Load 可以读取文件,然后将其放入一行。

您还可以使用临时文件 table 包装此过程,它将从文件中读取二进制数据,将其插入临时文件 table,然后 return来自 table.

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

我没试过,但你也可以使用处理 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 版本后可用

DB2 SQL 查询将 JPG 文件插入 table

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

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

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

我通过使用 IBM Data Studio 和以下查询成功地做到了这一点:

INSERT INTO MY_TABLE (BLOB_COLUMN) values (?);

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

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

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

  1. LOB tablespace (每个分区中的每个 LOB 列一个)
  2. 辅助 table 上面 table space 指向基 table 中的 blob 列(另外,每个 LOB 列一个每个分区)
  3. 辅助中的唯一索引table

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

数据库Table(示例table)

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

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

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"

此外,您可以插入 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.