文档章节

ORACLE读写文件

御风林海
 御风林海
发布于 2013/07/26 15:06
字数 558
阅读 1079
收藏 4

运用UTL_FILE包进行文件的读写操作

读文件的操作如下

步骤1:在oracle数据库中创建文件目录

SQL>create or replace directory ORADIR_HY  as '/home/qaadmin/';(如果登录的oracle用户没有创建目录的权限,则需要先授权

授权语句:Grant create  any directory to mengxm;)

步骤2:目录创建以后,就可以把读写权限授予登录用户

SQL>GRANT WRITE,READ ON DIRECTORY ORADIR TO mengxm;

步骤3:授权给登录oracle的用户使用utl_file包的权限(可能当前登录的用户没有使用utl——file的权限)

SQL>GRANT EXECUTE ON  utl_file  TO  sharedb;

步骤4:创建过程进行文件的读取

CREATE OR REPLACE PROCEDURE HY_1126 IS
  ASTRLINE VARCHAR2(26494);
  OUT_FILE UTL_FILE.FILE_TYPE;--定义一个文件类型
BEGIN
  OUT_FILE := UTL_FILE.FOPEN('ORADIR_HY', 'hy.txt', 'R');--打开指定目录的文件。ORADIR_HY是文件所在的目录,hy.txt是要读取的文件,R文件写入的模式 W:写,文件不存在则创建,会覆盖 A:追加 R:读  注意:这里的ORADIR_HY需要用单引号引起来
  LOOP
    BEGIN
      UTL_FILE.GET_LINE(OUT_FILE, ASTRLINE);--从OUT_FILE句柄中循环取得数据放入ASTRLINE变量中
      DBMS_OUTPUT.PUT_LINE(ASTRLINE);--打印读出来的内容
    EXCEPTION
      WHEN OTHERS THEN
        EXIT;
    END;
  END LOOP;
  UTL_FILE.FCLOSE(OUT_FILE);
END;

/

编译完毕后,调用出现下面的错误

SQL> exec HY_1126;
begin HY_1126; end;
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at "CNLOG.HY_1126", line 5
ORA-06512: at line 1

解决办法:

原因1:可能是目录不存在。可尝试如下的操作进行检查

SQL> create or replace directory ORADIR_HY   as '/home/qaadmin/';

Directory created.

SQL> host ls /home/qaadmin

/home/oracle/testdump not found

可以看到是目录不存在导致的,此时建立目录就OK

如果目录已经存在,还报如上的错误,那原因很可能就是没有设置utl_file包的可操作目录所致

原因2:没有设置utl_file的可操作目录。可设置utl_file的可操作目录后重新执行程序

SQL>alter system set utl_file_dir='/home/qaadmin/' scope=spfile;

SQL>exec HY_1126;

HELLO,I'M FROM FILE!

OK,成功了~

在过程中直接指定文件目录也是可以的。

将这句代码OUT_FILE := UTL_FILE.FOPEN('ORADIR_HY', 'hy.txt', 'R');

替换成

OUT_FILE := UTL_FILE.FOPEN('/home/qaadmin/, 'hy.txt', 'R');也是可以的。

© 著作权归作者所有

御风林海

御风林海

粉丝 87
博文 83
码字总数 52996
作品 0
广州
技术主管
私信 提问
加载中

评论(1)

Cavalier
Cavalier
上个项目也是oracle存取文件,个人感觉,他的文件操作效率没有那么高,尤其是加上那么一堆异常之后
裸设备和Oracle问答20例

1.什么叫做裸设备? 裸设备,也叫裸分区(原始分区),是一种没有经过格式化,不被Unix通过文件系统来读取的特殊字符设备。它由应用程序负责对它进行读写操作。不经过文件系统的缓冲。 2.如何...

linuxprobe
2016/06/24
4
0
Ruby通过OCI8操作Oracle存储BLOB

Oracle中BLOB是用来存储图片、文件等大数据对象的。 本文是一个Ruby读写Oracle的BLOB的例子,通过OCI8操作Oracle的存储过程 1、建表 CREATE TABLE "T_IMAGE" ("ID" NUMBER(11) GENERATED BY......

乾中
2016/04/26
144
0
Node.JS的异步IO具体指的是哪写操作?

本人彩笔一个,想请教诸位大神! 我们常用哪些操作属于IO? 我理解的IO就是从本地磁盘上读写数据,不知这样理解是否正确? 例如: 1.关系数据库(MySql,mssql,oracle...) 2.NoSQL(芒果....) 3...

Jieven
2013/08/06
557
3
Oracle11G导入到Oracle10

使用EXP从Oracle11G导出DMP文件,IMP导入到Oracle10G中,因为版本的向下兼容性,导致IMP出错。可采取一下方法操作。 1、修改DMP文件头部版本标识。 使用文本编辑器或者编写程序,修改DMP文件...

笨黄牛
2015/09/29
364
0
基于AEAI ESB的处理大字段

1.背景 数据迁移中大字段一直是个比较头疼的问题,一旦大字段中值大于32K的话就无法用sql语句来实现插入和更新。通用的解决办法一般有两种:存储过程和JDBC。下面主要总结下基于AEAI ESB用J...

数通畅联
2015/01/22
199
0

没有更多内容

加载失败,请刷新页面

加载更多

How to find table in a database with HeidiSQL

In this article I want to show you how you can find table by name with HeidiSQL. Find table by typing One of the options to find table is to having focus in the object explorer ......

Ciet
22分钟前
5
0
基于SWIG跨平台开发的C++编码规范

1、数组定义 使用数组不建议采用指针方式eg double *,或者 double test[4] 直接采用std::vector或list即可。对于固定长度的数组定义为一个结构体 double test[4]instead ofstruct Vec...

洋碱
24分钟前
8
0
用Markdown编程之布局

基本就是用Markdown的布局方式。 \:是转义符号,最高优先级。 行首+# :用于空间布局,1-6分别标明:模式根、子模式、子模式内。 行首+> :用于标注和通信,1个标明标注,2个标明分类,3个标...

dwcz
31分钟前
7
0
SpringBoot定时器多线程解决方案

@Scheduled 作用:spring定时器(定时执行一次或定时轮询执行一段代码) 使用场景:注解在方法上 参数说明:常用参数 @Scheduled 参数说明 String cron:cron表达式定义了方法执行的时间规则(网...

whoisliang
31分钟前
8
0
3.01、Spring AOP的理解

注:转 https://mp.weixin.qq.com/s/PsgTLn8cdTxdd542XgVkUA 什么是AOP AOP(Aspect-Oriented Programming), 即 面向切面编程 , 它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相......

追忆2025
37分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部