Oracle BFILE cand Directory:错误信息

Posted

技术标签:

【中文标题】Oracle BFILE cand Directory:错误信息【英文标题】:Oracle BFILE cand Directory: Error message 【发布时间】:2020-08-08 13:20:54 【问题描述】:

我对 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 Developer Icon

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

【问题讨论】:

您的数据库在哪里?是在同一台电脑上吗?如果 - 是,oracle 服务用户是否有权访问 C:\picture 目录? 我刚刚从我在上面的帖子中提供的链接下载了 SQLDeveloper。然后在 SQL Developer 中,我使用绿十字建立了与数据库服务器的连接。包含图像的目录是否必须在我与之建立连接的服务器上? 也正在community.oracle.com/thread/4342307处理 【参考方案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>

所以,如果一切正常,它工作

【讨论】:

感谢您的回答!当我运行盛大命令时,我收到错误消息:ORA-01749:“您可能不授予/撤销您自己的权限”我认为这意味着我已经拥有所有权利。假设是错误的吗?我进一步解释了我的第一篇文章,因为我不知道如何在这个答案中插入图片来回复您的评论。 不,这不是错误的意思。如果您创建一个目录,您将自动获得读写权限。从您的帖子看来,您自己创建了该目录,因此您已经拥有该目录的权限。但是这个错误是一个更普遍的错误,它告诉你不能只是“授予我东西”来给自己特权,因为如果每个人都可以做到这一点,那就没有安全性了。

以上是关于Oracle BFILE cand Directory:错误信息的主要内容,如果未能解决你的问题,请参考以下文章

oracle 某个表的字段里面的值是<clob>是啥意思

SQL 查询结果导出到EXCEL

oracle lob 简单介绍

Oracle中的数据类型

agc004cAND Grid

sh Creacion de Acceso Directo en Linux