0

我对 Oracle 和 BFILE 不是很有经验,所以如果我的问题的答案很明显,我很抱歉。我正在使用 Oracle SQL Developer 和 Oracle Database 12c 企业版。

我尝试通过 BFILE 在外部保存图像。为此,我创建了一个目录和一个表并插入了 BFILE:

DROP DIRECTORY PICTURE;
CREATE OR REPLACE DIRECTORY PICTURE AS 'C:\PICTURE';
 
DROP TABLE TEST1;
CREATE TABLE TEST1( NR INTEGER, IMAGE BFILE );
 
INSERT INTO TEST1 VALUES( 1, BFILENAME('PICTURE','IMG.png') );

代码运行没有错误。现在我想检查我是否正确粘贴了代码。为此,我使用以下函数。

SELECT DBMS_LOB.GETLENGTH(IMAGE) FROM TEST1;  

执行该函数后,我收到以下错误消息。

ORA-22288: file or LOB Operation GETLENGTH failed
The system could not find the specified path.
ORA-06512: in "SYS.DBMS_LOB", line 850

可能是什么原因?难道是我不允许这样指定路径吗?该路径指向我电脑上的一个文件夹。程序可以访问吗?如果这不是问题,那么可能导致错误消息的原因是什么?

更新:

当我运行 Grand 命令为我分配权限时,我收到以下错误消息

SQL > GRANT READ, WRITE ON DIRECTORY PICTURE TO XYZ;
ORA-01749: you may not GRANT/REVOKE privileges to/from yourself

我认为这意味着我已经拥有权利。

在 XYZ 工作时连接:

SQL> show user
USER is "XYZ"
SQL> select * from all_directories where directory_name = 'EXT_DIR';

OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ ------------------------------ --------------------
SYS                            PICTURE                        c:\PICTURE

SQL>

对于其余的代码,我的输出与 Littlefoot 回答的输出一致。只有使用 .getlength () 函数才能收到上述错误消息。

问题可能是我的 PC 不是数据库服务器。我使用装有 Windows 10 的 PC。我下载了以下版本:

https://www.oracle.com/de/tools/downloads/sqldev-v192-downloads.html

我每次使用资源管理器中的以下图标运行应用程序:

SQL 开发人员图标

然后在 SQL Developer 中,我连接到一个数据库实例。在数据库实例中,我可以使用一个方案来设置和管理文件。正如我所说,带有图片的 PICTURE 文件夹位于我的 PC 上的驱动器 C: 中。我正在尝试创建一个目录,然后访问该文件夹。我可以在没有专门配置我的 PC 的情况下这样做吗?

4

1 回答 1

1

Directory 是一个 Oracle 对象,它指向位于数据库服务器上的文件系统目录(通常;让我们假装“总是”) 。如果您的 PC 不是一台,那么它将无法工作。

由于目录指向c:\picture数据库服务器,

  • 该目录必须确实存在于那里
  • 图像必须在其中
    • 确保您没有错过实际的文件名
  • 作为用户,您必须(至少)read具有访问它的权限。
    • 这就是您发布的代码中缺少的内容。创建目录的用户(SYS,我想)应该运行例如

      grant read, write on directory picture to sql_user;
      

      (或您真正使用的任何用户)。


这是一个例子。我在笔记本电脑上运行 Oracle 11gXE(所以它一个数据库服务器)。文件位于c:\temp设置为 OracleEXT_DIR目录的目录中。

c:\Temp>dir robco.jpg
 Volume in drive C is OSDisk
 Volume Serial Number is 7635-F892

 Directory of c:\Temp

25.09.2017.  20:27             6.427 robco.jpg
               1 File(s)          6.427 bytes
               0 Dir(s)  234.166.730.752 bytes free

c:\Temp>

让我们看看Oracle方面:首先,授予用户访问权限scott(谁将加载文件):

SQL> show user
USER is "SYS"
SQL> grant read, write on directory ext_dir to scott;

Grant succeeded.

SQL>

连接为scott

SQL> show user
USER is "SCOTT"
SQL> select * from all_directories where directory_name = 'EXT_DIR';

OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ ------------------------------ --------------------
SYS                            EXT_DIR                        c:\temp

SQL>

创建表,插入一行,查看内容:

SQL> CREATE TABLE TEST1( NR INTEGER, IMAGE BFILE );

Table created.

SQL> INSERT INTO TEST1 VALUES( 1, BFILENAME('EXT_DIR','robco.jpg') );

1 row created.

SQL> SELECT * FROM test1;

        NR IMAGE
---------- --------------------------------------------------
         1 bfilename('EXT_DIR', 'robco.jpg')

SQL> SELECT DBMS_LOB.GETLENGTH(IMAGE) FROM TEST1;

DBMS_LOB.GETLENGTH(IMAGE)
-------------------------
                     6427

SQL>

所以,如果一切都做得正确,它就可以工作

于 2020-08-08T14:06:28.867 回答