oracle bfile cand directory:错误消息

mwkjh3gx  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(270)

我对oracle和bfiles不是很有经验,所以如果我的问题答案很明显,我很抱歉。我使用的是oracle sql developer和oracle database 12c enterprise edition。
我尝试通过bfile将图像保存到外部。为此,我创建了一个目录和一个表,并插入了bfiles:

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()函数,我才能得到上面描述的错误消息。
问题可能是我的电脑不是数据库服务器。我用的是装有windows10的电脑。我下载了以下版本:
https://www.oracle.com/de/tools/downloads/sqldev-v192-downloads.html
我每次都使用浏览器中的以下图标运行应用程序:
sql开发人员图标
在sqldeveloper中,我连接到一个数据库示例。在数据库示例中,我可以使用一个方案来设置和管理文件。如我所说,带有图片的图片文件夹位于我的pc驱动器c:。我试图创建一个目录,然后访问这个文件夹。我可以这样做,没有特别配置我的电脑?

nbnkbykc

nbnkbykc1#

目录是一个oracle对象,它指向一个文件系统目录(通常是;让我们假设“总是”)位于数据库服务器上。如果你的电脑不是一个,那么它将无法工作。
目录指向 c:\picture 在数据库服务器上,
那个目录一定真的存在那里
图像一定在里面
确保没有遗漏实际的文件名
作为用户,您必须(至少) read 有权访问它。
这就是你发布的代码中缺少的内容。创建目录的用户(sys,我猜)应该运行。

grant read, write on directory picture to sql_user;

(或者你真正使用的用户)。
下面是一个例子。我在笔记本电脑上运行oracle11gxe(所以它是一个数据库服务器)。文件位于 c:\temp 设置为oracle的目录 EXT_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>

所以,如果每件事都做得很好,它就会起作用。

相关问题