我正在学习 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.
您遇到的错误 (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)。