最近有朋友问我用Oricle存储过程读写文件,我说应该没有问题,然后本人用Google搜索一篇好文章,故收藏之!
测试环境:Oracle 9i +Linux for SUSE

有时候我们需要在文件与数据库表之间利用程序来实现两者的交互,这里可以利用UTL_FILE包实现对文件的I/O操作.下面就分别介绍文件写表以及表数据写文件.

[1]表信息导出到文件

在SUSE上建议一个文件夹/home/zxin10/file,然后对其chmod g+w file进行授权(否则无法导出到文件),再对您指定的路径(/home/zxin10/file)向Oracle的系统表sys.dir$进行注册(否则也是无法成功将信息导出到文件),操作完后可以查询sys.dir$可以看到表中的OS_PATH中有您指定的路径位置.

注册方式:执行SQL语句create or replace directory BBB as '/home/zxin10/file'; 即可

存储过程如下:(写文件时,文件名可以不用先创建,程序中会自动创建指定文件)

CREATE OR REPLACE PROCEDURE V3_SUB_FETCH_TEST_2
(
   V_TEMP VARCHAR2,
   --1为成功,0为失败
   v_retvalue   OUT NUMBER 
 )
AS
  --游标定义
  type ref_cursor_type is REF CURSOR;
  cursor_select   ref_cursor_type;
  select_cname    varchar2(1000);
  
  v_file_handle   utl_file.file_type;
  
  v_sql varchar2(1000);
  v_filepath Varchar2(500);
  v_filename Varchar2(500);
  --缓冲区
  v_results Varchar2(500);
  
  v_pid varchar2(1000);
  v_cpcnshortname Varchar2(500);
 
  begin
      v_filepath := V_TEMP;
      if v_filepath is null then
         v_filepath := '/home/zxin10/file3';
      end if;
      v_filename:='free_'|| substr(to_char(sysdate,'YYYYMMDDHH24MI'),1,10) ||'.all' ;
      --游标开始
      select_cname:='select cpid,cpcnshortname from zxdbm_ismp.scp_basic'; 
      --打开一个文件句柄 ,同时fopen的第一个参数必须是大写   
      v_file_handle:=utl_file.fopen('BBB',v_filename,'A');
      Open cursor_select For select_cname;   
      Fetch  cursor_select into v_pid,v_cpcnshortname;
      While  cursor_select%Found   
      Loop
      v_results := v_pid||'|'||v_cpcnshortname;
      --将v_results写入文件
      utl_file.put_line(v_file_handle,v_results);   
      Fetch  cursor_select into v_pid,v_cpcnshortname;      
      End Loop;
      
      Close cursor_select;--关闭游标
      utl_file.fClose(v_file_handle);--关闭句柄
      v_retvalue :=1;
  exception when others then
         v_retvalue :=0; 
  end V3_SUB_FETCH_TEST_2;

[2]将文件信息导入到表中

和上面一样,先对指定文件路径进行chmod,然后想Oracle的sys.dir$进行路径注册.

文件zte.apsuic位于/home/zxin10/file下,其数据格式:
1|22|cheng
2|33|zhou
3|44|heng
4|55|yaya

表LOADDATA脚本:

-- Create table
create table LOADDATA
(
  ID   VARCHAR2(50),
  AGE  VARCHAR2(50),
  NAME VARCHAR2(50)
)
    /

程序如下:(读取文件时,指定文件名一定要预先存在,否则程序会失败)

create or replace directory BBB as '/home/zxin10/file';
/
--作用法是将特定的文件路径信息想Oracle注册(注册信息存放在sys.dir$表中)

CREATE OR REPLACE PROCEDURE V3_SUB_FETCH_TEST_3
(
   --文件中的信息导入表中
     V_TEMP VARCHAR2,
     v_retvalue   OUT NUMBER --1 成功 ,0失败
AS 
  v_file_handle   utl_file.file_type;  
  v_sql varchar2(1000);
  v_filepath Varchar2(500);
  v_filename Varchar2(500);  
  --文件到表字段的映射
  v_id varchar2(1000);
  v_age varchar2(1000);
  v_name varchar2(1000);
  --缓冲区
  v_str varchar2(1000);
  --列指针
  v_i number;
  --字符串定位解析指针
  v_sposition1 number;
  v_sposition2 number;
  begin
      v_filepath := V_TEMP;
      if v_filepath is null then
         v_filepath := '/home/zxin10/file';
      end if;
      v_filename:='zte.apsuic';
      --v_sql:= 'create or replace directory CCC as '''|| v_filepath || '''';
      --execute immediate v_sql; 
      
      v_file_handle:=utl_file.fopen('CCC',v_filename,'r');       
      Loop
             --将文件信息读取到缓冲区v_str中,每次读取一行
             utl_file.get_line(v_file_handle,v_str);
             --dbms_output.put_line(v_str); 
             --针对每行的列数
             v_i := 1;
             --针对字符串每次的移动指针
             v_sposition1 := 1;
             --文件中每行信息3列,循环3次
             FOR I IN 1..3 loop               
             --当instr(v_str, '|', 6)其中v_str为1|22|wuzhuocheng ,它返回0
             v_sposition2 := instr(v_str, '|', v_sposition1);
             --字符串解析正常情况
             if v_sposition2 <> 0 then
               if v_i=1     then
                  v_id := substr(v_str, v_sposition1, v_sposition2 - v_sposition1);      --第一列               
               elsif  v_i=2 then
                    v_age := substr(v_str, v_sposition1, v_sposition2 - v_sposition1); --第二列
               elsif v_i=3  then
                  v_name := substr(v_str, v_sposition1, v_sposition2 - v_sposition1);    --第三列 
               else
                  return;
               end if;                            
             --字符串解析异常情况
             else 
               if v_i=1    then
                v_id := substr(v_str, v_sposition1);      --第一列
               elsif v_i=2 then
                  v_age := substr(v_str, v_sposition1); --第二列
               elsif v_i=3 then
                v_name := substr(v_str, v_sposition1);    --第三列 
               else
                return;
               end if;  
             end if;   
             v_sposition1 := v_sposition2 + 1;
             v_i := v_i+1;
             end loop; 
             --每列循环完后将信息insert into表中
             insert into zxdbm_ismp.loaddata values(v_id,v_age,v_name);                  
      End Loop;
      --关闭句柄
      utl_file.fClose(v_file_handle);
      v_retvalue :=1;
  exception when others then
         v_retvalue :=0; 
  end V3_SUB_FETCH_TEST_3;

文章出处:http://www.blogjava.net/cheneyfree/archive/2007/12/04/165275.html

转载于:https://www.cnblogs.com/OceanChen/archive/2009/02/11/1388185.html

【收藏】Oracle存储过程读写文件相关推荐

  1. oracle proedure 文件_关于oracle存储过程读取文件

    你的位置: 问答吧 -> Oracle -> 问题详情 关于oracle存储过程读取文件 问题:我知道只能读取固定目录的文件,我想问的是 1,文件名可以通过参数传入存储过程中吗? 2,怎么 ...

  2. oracle存储过程文件在哪,Oracle存储过程读文件-Oracle

    Oracle存储过程读文件 create or replace PROCEDURE PR_FINANCE_PRODUCT_PARSE ( v_filename  IN  VARCHAR2,   –解析 ...

  3. oracle 存储过程写文件,Oracle写本地文件

    Oracle写本地文件是指写到运行Oracle的主机上,而不是运行该脚本的机器上. 说起来有点拗口,实际上就是无论在哪里执行这个过程,生成的文件始终都是在服务器上的. 下面过程实现了这个功能: log ...

  4. oracle读写文件--利用utl_file包对磁盘文件的读写操作

    oracle读写文件--利用utl_file包对磁盘文件的读写操作 摘要: 用户提出一个需求,即ORACLE中的一个表存储了照片信息,字段类型为BLOB,要求能导出成文件形式. 本想写个C#程序来做, ...

  5. oracle中xml如何存储过程,oracle存储过程生成xml文件

    oracle存储过程生成xml文件 CREATE OR REPLACE PROCEDURE Pro_OracleToXML(personid varchar2,name varchar2,addres ...

  6. oracle 存储过程 存储 blob,穿越oracle存储过程的Blob参数上传文件

    前两天朋友找我做一个上传过程,极其容易的一个东西!我未曾用过java,现学现卖,反正也是很容易. 不过,其中除非碰到一个东西,在网上查了半晌,也未曾找遍地理的措施!尔后才好不轻率获胜了.我把这个登记下 ...

  7. oracle写java文件_Oracle PL/SQL java读写文件权限问题得到解决

    在ORACLE中PL/SQL利用java读取文件 参考了 的内容,但是出现如下错误: Exception in thread "Root Thread" java.security ...

  8. oracle 文件读写,Oracle读写文件bfilename

    Oracle读写文件bfilename以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Create directory让 ...

  9. oracle存储过程循环输入数据,oracle 存储过程循环插入数据

    Database 物理文件 控制文件(Control File) 1.一个数据库至少需要一个控制文件 2.控制文件(二进制文件)是一个很小的(通常是数据库中最小的)文件,大小一般在1-5M左右. 3. ...

最新文章

  1. unsigned int 和 int
  2. 不可摸数http://acm.hdu.edu.cn/showproblem.php?pid=1999
  3. 整数线性规划实现(lingo,python分枝界定法)
  4. 4.9 利用对应的泛型替换Hashtable[转]
  5. C++文件操作初体验
  6. 用R语言实现深度学习情感分析
  7. 使用@AspectJ注解开发Spring AOP
  8. Luogu1638 逛画展
  9. ubuntu18.04 init setting
  10. C# NFine开源框架 调用存储过程的实现代码
  11. 2003服务器系统驱动精灵,万能驱动助理 e驱动 6.1.2014.0516 for XP/win2003 32位专版
  12. php加密解密 hash,PHP 加解密总结之 hash
  13. 真无线蓝牙耳机哪个音质最好?2021入门级蓝牙耳机排行榜!
  14. K8S教程(7)使用探针对容器进行健康检查
  15. 98年阿里P6架构师晒出工资单,看完扎心了。。。
  16. UI组件介绍(for设计师)
  17. 精确到秒!一位清华学霸的学习生活计划表,值得借鉴!
  18. 霍兰德air适合学计算机吗,霍兰德职业兴趣测验(含职业代码)
  19. Android笔记(十九)制作一个简易的指南针
  20. Java 第一个程序Hello

热门文章

  1. 新站SEO优化五点注意事项!
  2. 自己挖的坑自己填--JVM报内存溢出
  3. python文档的数据读取,把读取数据写入到新的表里
  4. mysql当前用户user()与current_user()
  5. 【支付专区】之解析微信支付返回xml
  6. 【SSH三个框架】Hibernate第八部分基础:经营-many关系
  7. 推荐算法-聚类-均值偏移聚类(爬山算法)
  8. Windows核心编程 第十八章 堆栈
  9. hdu4909 状态压缩(偶数字符子串)
  10. Android-可自动缩小字体的TextView