如何在 Oracle PLSQL 中声明 Windows 路径

Posted

技术标签:

【中文标题】如何在 Oracle PLSQL 中声明 Windows 路径【英文标题】:How to declare Windows path in Oracle PLSQL 【发布时间】:2019-11-21 19:41:58 【问题描述】:

我需要从保存在 Windows 中的图像中刻录一个 blob 列。 如何在 Oracle PLSQL 中声明图像路径?

例如:

DECLARE
  dest_lob BLOB;

  -- this line report ORA22285 "non-existent directory or file for %s operation"
  src_lob  BFILE := BFILENAME('MY_DIR', 'C:\Users\gus\Desktop\image.jpg');

BEGIN
  INSERT INTO teste_gustavo_blob VALUES(2, EMPTY_BLOB())
    RETURNING imagem 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;

注意:我正在尝试使用 SQLDeveloper 通过 Windows 机器将记录插入表中。数据库位于远程服务器上。

【问题讨论】:

数据库是否在您的本地机器上运行?还是在服务器上?当您说“刻录 blob”时,您的意思是“加载 blob”吗? 【参考方案1】:

路径必须是目录对象定义的一部分,而文件名就是这样 - 只是文件名。示例;

CREATE DIRECTORY MY_DIR AS 'C:\Users\gus\Desktop';
..
   BFILENAME('MY_DIR', 'image.jpg');

请注意,该目录是在服务器而不是您的本地计算机上创建的。所以如果你试图在本地机器上创建一个文件,这在 pl/sql 中是行不通的。 PL/sql 在服务器上运行,而不是在客户端上。在这种情况下,您需要编写客户端代码。

【讨论】:

错误仍然存​​在。错误报告 - ORA-22288:文件或 LOBFILEOPEN 操作失败 没有这样的文件或目录 ORA-06512:在“SYS.DBMS_LOB”,第 1014 行 ORA-06512:在第 8 行 22288。00000 -“文件或 LOB 操作%s 失败\ n%s" * 原因:对文件或 LOB 的操作尝试失败。 * 操作:查看错误堆栈中的下一条错误消息以获取更多详细信息。此外,验证文件或 LOB 是否存在以及是否为指定操作设置了必要的权限。如果错误仍然存​​在,请将错误报告给 DBA。 那么你是在你的windows机器上运行数据库服务器吗? 不,我正在尝试使用 SQLDeveloper 通过 Windows 机器将记录插入到表中 你不能那样做。该文件必须存在于服务器上。来自 oracle 文档 - “目录对象为服务器文件系统上的目录指定别名,外部二进制文件 LOB (BFILE) 和外部表数据位于该目录。”【参考方案2】:

数据库只能看到它本地的目录。它无法查看您 PC 上的文件(除非数据库正在该 PC 上运行)。所以你不能通过 PL/SQL 加载你的文件。

但是,您说您正在使用 SQL Developer。您可以通过在 Table Navigator 中编辑表的数据来加载 BLOB。单击Data 选项卡,然后编辑单元格(要将文件加载到的行的BLOB 列)。使用本地数据 > 加载选项上传您的文件。 Jeff Smith 已经发布了a detailed step-by-step guide on his blog。

【讨论】:

以上是关于如何在 Oracle PLSQL 中声明 Windows 路径的主要内容,如果未能解决你的问题,请参考以下文章

oracle PLSQL块和复合类型

Plsql developer 工具创建存储过程,必须要在package 文件下创建存储声明 pa

将值从 Oracle 对象类型参数传递到 PLSQL 表类型参数

plsql配置新的oracle如何连接?

如何在 PLSQL 中获取 livesql.oracle.com 中的用户输入

Oracle中PLSQL的语法