如何使用 PL/SQL 读取 Oracle 目录的所有文件并更新 BLOB 列
Posted
技术标签:
【中文标题】如何使用 PL/SQL 读取 Oracle 目录的所有文件并更新 BLOB 列【英文标题】:How to read all files of an Oracle Directory with PL/SQL and update a BLOB column 【发布时间】:2018-09-11 08:39:11 【问题描述】:如果文件名与 PK 表匹配,我需要读取 Oracle 目录的每个文件(不知道名称)并使用该文件更新 BLOB 列。
TABLE_TEST
ID NUMBER(10,0) PK
FOTO BLOB NULL
我做了一个 PL/SQL 函数来读取一个文件(知道名称)并使用 BLOB 更新表,这可以正常工作。但是,我不知道如何在不知道文件名的情况下读取每个文件并获取文件名。
DECLARE
l_blob BLOB;
v_src_loc BFILE := BFILENAME ('IMAGE_FILES8', '4.PNG');
v_amount INTEGER;
BEGIN
UPDATE TABLE_TEST
SET FOTO = EMPTY_BLOB ()
WHERE ID = 4
RETURN FOTO
INTO l_blob;
DBMS_LOB.OPEN (v_src_loc, DBMS_LOB.LOB_READONLY);
v_amount := DBMS_LOB.GETLENGTH (v_src_loc);
DBMS_LOB.LOADFROMFILE (l_blob, v_src_loc, v_amount);
DBMS_LOB.CLOSE (v_src_loc);
COMMIT;
END;
【问题讨论】:
请参阅asktom.oracle.com/pls/asktom/… 和oracle-developer.net/display.php?id=513,了解两种读取目录中文件详细信息的方法。 可能是 ***.com/questions/17404708/… 的副本(然后,您只需将解决方案放入循环中,以便目录中的每个文件更新 blob)。 需要新建一个表。不创建新表是否可行? 我说的是使用Oracle 的CREATE JAVA
语句将Java 嵌入到数据库中,然后您可以在PL/SQL 中调用它。创建解决方案很复杂,我没有时间为您做,但我希望这里有足够的面包屑,您或其他人可以实现它。另一种解决方案是使用外部表预处理器,在我的第一条评论的第二个链接中有详细说明。
问题的关键在于从数据库内部与操作系统交互很困难:不是以编程方式而是在架构上。有各种各样的安全和管理问题,这就是为什么它默认没有打开的原因。因此,虽然存在一些技术复杂性,但更棘手的问题是政治问题(获得做事的特权)。您希望避免创建新表表明您在这种政治约束下工作。
【参考方案1】:
看看这个网站,它解释了如何从目录中读取所有文件。
https://asktom.oracle.com/pls/asktom/asktom.search?tag=reading-files-in-a-directory-how-to-get-a-list-of-available-files
【讨论】:
以上是关于如何使用 PL/SQL 读取 Oracle 目录的所有文件并更新 BLOB 列的主要内容,如果未能解决你的问题,请参考以下文章
从 .txt 文件读取数据并将其插入 Oracle SQL DB [PL/SQL,Unix 脚本]