Oracle数据库-关于读取文件路径的问题整理
Oracle中对文件的操作都要建立目录对象,目录对象实际是一种映射机制,目录对象是一种系统资源,需要由管理员创建,任何经过授权的用户都可以使用这个目录对象。目录对象本质上就是数据库对象对应一个实际磁盘目录路径。因为处于系统可移植性和管理方便考虑Oracle程序中对文件操作一般不使用实际的文件路径。
可以这样建立目录对象。首先在磁盘建立目录文件夹,然后管理员登录建立目录对象:
CREATE DIRECTORY TEST_DIR AS 'C:/DEVELOP';
目录对象的名称是 TEST_DIR ,代表的实际目录是C:/DEVELOP,注意DEVELOP是文件夹的名称,需要手动在对应位置建立,将来操作的文件都会在这个文件夹下。
如果SCOTT 用户要使用目录对象,则需要管理员进行如下授权:
GRANT READ,WRITE ON DIRECTORY TEST_DIR TO SCOTT;
SCOTT用户下,以下代码把所有部门信息写入名称为dept.xml的XML文件中:
DECLARE
result CLOB;--存放初始的XML信息
output_file UTL_FILE.FILE_TYPE;--文件对象
xmlstr VARCHAR2(32767);--存放XML
line VARCHAR2(2000);--存放一行XML
line_no INTEGER := 1;
BEGIN
--获取初始的XML,是CLOB数据
result := DBMS_XMLQuery.getXml('SELECT * FROM dept');
--获取大对象CLOB中文本信息,注意这里假设所有的XML信息不会超过32767
xmlstr := DBMS_LOB.SUBSTR(result,32767);
--UTL_FILE.FOPEN方法创建文件,返回文件对象
output_file := UTL_FILE.FOPEN('TEST_DIR','dept.xml','w');
LOOP
EXIT WHEN xmlstr IS NULL;
line := SUBSTR(xmlstr,1,INSTR(xmlstr,CHR(10))-1);
DBMS_OUTPUT.PUT_LINE(line_no || ':' || line);
--UTL_FILE.PUT写一行信息到文件
UTL_FILE.PUT(output_file,line || CHR(10));
xmlstr := SUBSTR(xmlstr,INSTR(xmlstr,CHR(10))+1);
line_no := line_no + 1;--行号增加
END LOOP ;
UTL_FILE.FCLOSE(output_file);--关闭文件对象
END;
过程中函数说明:
CHR(10) 是把数字10转化成对应的ASCII码回车
INSTR(xmlstr,CHR(10) 是在xmlstr中查找第一个回车出现的位置,返回整数。
SUBSTR(xmlstr,1,INSTR(xmlstr,CHR(10))-1)是截取字符串,截取xmlstr从第1个截取到第INSTR(xmlstr,CHR(10))-1个,也就是截取第一行XML 信息(因为原始的XML是分行的)。
如果不需要输出行号到控制台,仅仅写文件,如下过程更简洁:
DECLARE
result CLOB;
output_file UTL_FILE.FILE_TYPE;
xmlstr VARCHAR2(32767);
BEGIN
result := DBMS_XMLQuery.getXml('SELECT * FROM dept');
xmlstr := DBMS_LOB.SUBSTR(result,32767);
output_file := UTL_FILE.FOPEN('TEST_DIR','dept.xml','w');--打开
UTL_FILE.PUT(output_file,xmlstr);
UTL_FILE.FCLOSE(output_file);--关闭
END;
以下是读文件的例子:
DECLARE
input_file UTL_FILE.FILE_TYPE;
input_buffer VARCHAR2(4000);
BEGIN
input_file := UTL_FILE.FOPEN('TEST_DIR', 'dept.xml', 'r'); --打开
LOOP
UTL_FILE.GET_LINE(input_file,input_buffer);--读取
DBMS_OUTPUT.PUT_LINE(input_buffer);
END LOOP ;
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(input_file); --关闭
DBMS_OUTPUT.PUT_LINE('------------------');
END;
可以看出读取文件同样是三个步骤。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?