【问题标题】:How to automate image storing on oracle database?如何在 oracle 数据库上自动存储图像?
【发布时间】:2021-07-24 07:38:10
【问题描述】:

我正在尝试将图像存储在数据库中。所以我创建了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”。如何实现流程自动化?

【问题讨论】:

  • 当您说“在文件中”时,您的意思是“在目录中”吗?如果要处理目录中的每个文件,我会使用 SQL*Loader 而不是 PL/SQL。 oracle-base.com/articles/10g/load-lob-data-using-sql-loader 您可以将匿名块转换为存储过程,然后从lsdir 命令的输出中编写对该过程的数千次调用。我过去使用 Java 存储过程通过查询返回目录中的每个文件。您还可以使用带有预处理器脚本的外部表。
  • Larry Ellison(Oracle 的所有者)每次看到这样的问题时都会跳一段小舞。直接从数据库 LOB 传送图像可能是最昂贵的方式。与其他数据库操作相比,Oracle 许可证需要花费真金白银,而且 LOB 检索速度不是很快。最好将图像存储在文件系统中,并将它们的文件路径存储在数据库中。说真的。

标签: oracle plsql oracle11g blob


【解决方案1】:

您可以循环遍历从 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;
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2021-11-30
    • 2012-03-10
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多