oracle - 如何在 oracle 数据库上自动存储图像?
问题描述
我正在尝试将图像存储在数据库中。所以我创建了 lob_table
CREATE TABLE lob_table (id NUMBER, doc BLOB);
CREATE OR REPLACE DIRECTORY my_dir AS 'C:\temp';
DECLARE
src_lob BFILE := BFILENAME('MY_DIR', 'example.jpg');
dest_lob BLOB;
BEGIN
INSERT INTO lob_table VALUES(1, EMPTY_BLOB())
RETURNING doc INTO dest_lob;
DBMS_LOB.OPEN(src_lob, DBMS_LOB.LOB_READONLY);
DBMS_LOB.LoadFromFile( DEST_LOB => dest_lob,
SRC_LOB => src_lob,
AMOUNT => DBMS_LOB.GETLENGTH(src_lob) );
DBMS_LOB.CLOSE(src_lob);
COMMIT;
END;
但在目录中大约有 90000 张照片,每张照片都以其 id 名称存储,如“1.jpg”。我怎样才能使这个过程自动化?
解决方案
您可以循环遍历从 1 到上限 100,000 的整数集,作为大于 900,000 的任意值,以覆盖所有这些文件,同时检查每个文件是否存在,以便在没有任何文件时跳过该间隔之间的整数值,例如
DECLARE
src_lob BFILE;
dest_lob BLOB;
v_exists INT;
BEGIN
FOR i IN 1..100000
LOOP
BEGIN
src_lob := BFILENAME('MY_DIR', i||'.jpg');
v_exists := dbms_lob.fileexists(src_lob);
IF v_exists = 1 THEN
INSERT INTO lob_table VALUES(i, EMPTY_BLOB()) RETURNING doc INTO dest_lob;
DBMS_LOB.OPEN(src_lob, DBMS_LOB.LOB_READONLY);
DBMS_LOB.LOADFROMFILE( DEST_LOB => dest_lob,
SRC_LOB => src_lob,
AMOUNT => DBMS_LOB.GETLENGTH(src_lob) );
DBMS_LOB.CLOSE(src_lob);
IF i MOD 1000 = 0 THEN COMMIT; END IF;
END IF;
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
END LOOP;
COMMIT;
END;
/
推荐阅读
- mfc - 使用 Visual Studio 将项目从 32 位转换为 64 位时,是否必须将 int(索引变量)更改为 INT_PTR 或 size_t?
- reactjs - 如何在 reactjs(16.13.0) 代码中为自定义材质 ui 组件执行正确的重定向?
- input - MRTK 和握压机
- php - PHP 元页面说明
- docker - 每N次上传一次上传Docker镜像GCP?
- php - 在php中转换数组数组的顺序
- java - 我应该如何在员工维护系统中实现 LeaveHistory
- java - 是否可以将枚举值作为 Java 中的私有静态最终常量?
- php - 检查密码是否与用户名在同一行中匹配
- c# - 如何在 .NET Core 中传递预处理器条件