Oracle DB 21c XE读取网络共享驱动器文件时提示路径/文件不存在
解决UTL_FILE访问网络共享文件的ORA-29283错误
核心问题分析
你遇到的错误本质是Oracle数据库服务的运行账户无法识别你手动挂载的Z盘,同时映射盘符的方式不适用于服务级别的文件访问。Windows的网络驱动器映射是绑定到当前登录用户会话的,而Oracle服务默认使用Local System账户运行,这个账户无法访问你个人会话中挂载的Z盘。
解决方案步骤
1. 改用UNC路径创建目录对象
放弃使用映射盘符Z:,直接使用网络共享的UNC路径格式:
CREATE OR REPLACE DIRECTORY NETTEST AS '\\你的Win10电脑名称\共享文件夹名称'; -- 示例:若Win10电脑名为WIN10-PC,共享文件夹叫ShareFolder,路径就是'\\WIN10-PC\ShareFolder'
之后重新授予读写权限:
GRANT READ, WRITE ON DIRECTORY NETTEST TO 你的数据库用户;
2. 调整Oracle服务的运行账户
- 打开Windows服务管理器(按Win+R输入
services.msc) - 找到
OracleServiceXE和OracleOraDB21Home1TNSListener服务 - 右键点击服务,选择属性 -> 登录标签页
- 选择此账户,输入你当前登录Win11的用户账户和密码(该账户需能访问Win10的共享文件夹)
- 重启这两个Oracle服务
3. 验证共享权限
确保Win10的共享文件夹权限满足:
- 共享权限:给指定的Oracle服务运行账户(或Everyone)分配读取/写入权限
- NTFS权限:同样给该账户分配读取权限(仅读取文件时)
4. 执行修改后的PL/SQL代码
代码无需大调整,只需保证文件名正确,示例:
SET SERVEROUTPUT ON; DECLARE f1 UTL_FILE.FILE_TYPE; s VARCHAR2(32767); BEGIN f1 := UTL_FILE.FOPEN('NETTEST', 'test.txt', 'r'); LOOP BEGIN UTL_FILE.GET_LINE(f1, s); DBMS_OUTPUT.PUT_LINE(s); EXCEPTION WHEN NO_DATA_FOUND THEN EXIT; END; END LOOP; UTL_FILE.FCLOSE(f1); END; /
关键注意事项
- 服务级别的文件访问必须用UNC路径,不能使用映射盘符
- Oracle服务账户必须拥有网络共享的访问权限,
Local System账户无法访问网络资源 - 确保Win10和Win11在同一局域网,且网络共享未被防火墙拦截
内容的提问来源于stack exchange,提问作者Nehan Shashith
相关产品推荐
相关产品推荐

