使用 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
语句。
- LOB tablespace (每个分区中的每个 LOB 列一个)
- 辅助 table 上面 table space 指向基 table 中的 blob 列(另外,每个 LOB 列一个每个分区)
- 辅助中的唯一索引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.
我遇到了这样一种情况,我需要通过从 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
语句。
- LOB tablespace (每个分区中的每个 LOB 列一个)
- 辅助 table 上面 table space 指向基 table 中的 blob 列(另外,每个 LOB 列一个每个分区)
- 辅助中的唯一索引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.