我想将文件类型插入表中,但无法在 Oracle SQL Developer 中执行此操作

问题描述 投票:0回答:1

我正在学习 SQL,并在 Oracle SQL Developer 中使用以下查询创建了一个实体。

CREATE TABLE application (
    applicationid      NUMBER,
    proofofidentity    BLOB NOT NULL,
    status             VARCHAR2(50) DEFAULT 'PENDING',
    userid       NUMBER NOT NULL,
    adminid     NUMBER NOT NULL
);

现在我想插入几行。所以,我想知道如何直接获取文件,将其转换为BLOB并插入?

我尝试了下面提到的查询,但它不起作用:/

DECLARE
    l_bfile BFILE;
    l_blob  BLOB;
BEGIN

    l_bfile := BFILENAME('C:/Users/user name/Desktop/practice', 'proofofidentity_sample.pdf');
    DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly);

    -- Initialize the BLOB
    DBMS_LOB.createtemporary(l_blob, TRUE);

    -- Load the file into the BLOB
    DBMS_LOB.loadfromfile(l_blob, l_bfile, DBMS_LOB.getlength(l_bfile));
    
    BEGIN 
        INSERT INTO application (applicationid, proofofidentity, status, userid, adminid)
        VALUES (1, l_blob, 'Approved', 1, 1);
    EXCEPTION
     WHEN OTHERS THEN 
        DBMS_OUTPUT.PUT_LINE('Error in the INSERT: ' || SQLERRM);

END;
/

我收到以下错误,尝试了多个路径,不幸的是它们不起作用。

Error report -
ORA-22285: non-existent directory or file for FILEOPEN operation
ORA-06512: at "SYS.DBMS_LOB", line 822
ORA-06512: at line 7
22285. 00000 -  "non-existent directory or file for %s operation"
*Cause:    Attempted to access a directory that does not exist, or attempted
           to access a file in a directory that does not exist.
*Action:   Ensure that a system object corresponding to the specified
           directory exists in the database dictionary, or
           make sure the name is correct.
sql plsql oracle-sqldeveloper plsqldeveloper
1个回答
0
投票

您遇到的错误 (ORA-22285) 表示 BFILENAME 函数中指定的目录不存在或不可访问。

在Oracle中,BFILENAME函数用于将目录对象与文件名关联起来。在使用 BFILENAME 之前,您需要确保在数据库中创建了目录对象,并且它指向文件系统中正确的物理目录。

以下是解决问题的步骤:

创建目录对象: 以具有适当权限的用户(例如 DBA 或具有 CREATE ANY DIRECTORY 权限的用户)身份登录 Oracle 数据库,并执行以下 SQL 语句来创建目录对象:

创建目录 my_dir 或将其替换为“C:\Users\用户名\桌面\practice”;

授予必要的权限: 授予用户对该目录的读取权限:

将目录 my_dir 的读取权限授予您的用户;

修改您的 PL/SQL 块: 更新您的 PL/SQL 块以使用您刚刚创建的目录对象:

声明 l_bfile BFILE; l_blob BLOB; 开始 l_bfile := BFILENAME('MY_DIR', 'proofofidentity_sample.pdf'); DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly);

-- Initialize the BLOB
DBMS_LOB.createtemporary(l_blob, TRUE);

-- Load the file into the BLOB
DBMS_LOB.loadfromfile(l_blob, l_bfile, DBMS_LOB.getlength(l_bfile));

BEGIN 
    INSERT INTO application (applicationid, proofofidentity, status, userid, adminid)
    VALUES (1, l_blob, 'Approved', 1, 1);
EXCEPTION
 WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('Error in the INSERT: ' || SQLERRM);
END;

-- Close the file
DBMS_LOB.fileclose(l_bfile);

结束; /

确保您有适当的权限并且目录路径正确。另外,请记住将 'C:\Users\user name\Desktop\practice' 替换为正确的路径,并相应地调整目录对象名称 (MY_DIR)。

© www.soinside.com 2019 - 2024. All rights reserved.