如何使用 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 列的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL配置和连接远端数据库

从 .txt 文件读取数据并将其插入 Oracle SQL DB [PL/SQL,Unix 脚本]

使用 PL/SQL 将数据从 file.txt 导入 Oracle SQL 表

PL/SQL oracle 过程不返回任何值

打印 Oracle Pl/sql 光标

如何使用 pl/sql 脚本导出 oracle sql 开发人员表模式?