`

oracle的文件读写

阅读更多
从数据库读记录写入文件中
create or replace function dump_csv( p_tname     in varchar2, --表名
                                      p_dir       in varchar2 , --目录
                                      p_filename  in varchar2, --文件名
                                      p_query     in  varchar2 DEFAULT ' where 1=1 ', --查询条件
                                      p_separator in varchar2  default ',' ) --分隔符
return number --返回值
AUTHID CURRENT_USER --Authid Current_User 进行权限分配
is
    exp_output        utl_file.file_type;
    exp_theCursor     integer default dbms_sql.open_cursor; --创建游标
    exp_columnValue   varchar2(2000); --导出表的列名
    exp_status        integer; --执行动态SQL的状态
    exp_colCnt        number default 0; --统计
    exp_separator     varchar2(10) default ''; --分隔符
    exp_cnt           number default 0; --统计列的数目
    str_sql           VARCHAR2(2000); --要拼的SQL
    substr_sql        VARCHAR2(2000); --截取后的SQL
    str_length          INTEGER; --截取前拼好的SQL长度
     cursor cursor_column                           --游标:通过数据字典查找出表有哪些字段
         is select column_name,data_type
         from user_tab_columns where table_name=upper(p_tname);
begin
    exp_output := utl_file.fopen( p_dir, p_filename||'.csv', 'w' ); --打开文件流
      for col in cursor_column loop --循环读取列名
       if col.data_type='DATE' then --判断列的类型
            str_sql:=str_sql||'to_char('||col.column_name||',''yyyy-mm-dd hh24:mi:ss''),';--如果是DATE类型格式化
       else
            str_sql:=str_sql||col.column_name||','; --否则累加
       end if;
        select length(str_sql) into str_length from dual; --获取拼好后str_sql的长度
        if str_length <>0 then --判断str_sql的长度
          select substr(str_sql,0,length(str_sql)-1) into substr_sql from dual; --如果大于零就截取最后一位的逗号
        end if;
        utl_file.put(exp_output,upper(col.column_name||',')); --写入文件
        exp_colCnt:=exp_colCnt+1; --统计列的数目
      end loop;
     utl_file.put_line(exp_output,''); --换行
     substr_sql:=rtrim(substr_sql,'||chr(9)||'); --去年空格
     str_sql:='select '||substr_sql||' from '||p_tname||' '||p_query; --措查询语句
    dbms_sql.parse(  exp_theCursor,  str_sql, dbms_sql.native ); --向服务器发出一个语句并检查这个语句的语法和语义错误
    for i in 1 .. exp_colCnt loop
        begin
            dbms_sql.define_column( exp_theCursor, i, exp_columnValue, 2000 ); --保存记录
        exception
            when others then --判断异常如果为1007为EXIT,否则就抛出异常
                if ( sqlcode = -1007 ) then exit;
                else
                    raise;--抛出异常
                end if;
        end;
    end loop;
    exp_status := dbms_sql.execute(exp_theCursor); --执行此语句,因为执行的是查询,所以必须跟着Fetch_Rows函数并为单个行检索数据
    loop
        exit when ( dbms_sql.fetch_rows(exp_theCursor) <= 0 ); --如果记录行数小于零就EXIT;
        exp_separator := ''; --分隔符
        for i in 1 .. exp_colCnt loop --循环读取记录
            dbms_sql.column_value( exp_theCursor, i,exp_columnValue ); --保存对应列的变量中
    select convert(exp_columnValue,'ZHS16GBK','AL32UTF8') into exp_columnValue   from dual;--转码
            utl_file.put( exp_output, exp_separator ||exp_columnValue ); --写入文件中
            exp_separator := p_separator; --分隔符赋值
        end loop;
        utl_file.new_line( exp_output ); --换行
        exp_cnt := exp_cnt+1; --统计
    end loop;
    dbms_sql.close_cursor(exp_theCursor); --关闭动态游标
    utl_file.fclose( exp_output ); --关闭文件流
    return exp_cnt; --返回统计数
end dump_csv;

///------------------------------------------
create or replace procedure test_dump_csv --储存过程
as
exp_rows  number;
begin
exp_rows := dump_csv( 'stuinfo', 'UTL_FILE_DIR', 'stuinfo',' where  rownum < 100  order by id asc',','); --调用dump_csv
end;
//--------------------------
exec test_dump_csv

把文件中的记录写入数据中
create or replace procedure p_imp(p_fname varchar2)
    as
v_line   varchar2(2000);                        --记录的数据
v_sql    Long;                        --动态sql变量
v_tname  varchar2(40);                          --表名字
inf      utl_file.file_type;
v_cloumn varchar(2000); --要插入的列信息
l_cur integer; --创建游标
v_num    number; --接收插入SQL受影响行数
begin
    v_tname:=substr(p_fname,1,instr(p_fname,'.')-1) ;     --截取表的名字
    inf:=utl_file.fopen('UTL_FILE_DIR',p_fname,'r');   --打开文件
    utl_file.get_line(inf,v_line);           --获取列信息
    --dbms_output.put_line(v_line);   --打印列信息
    v_cloumn:=v_line;   --给v_cloumn赋值
    v_sql:='insert into '|| v_tname;   --拼SQL插入语句
    loop
      begin
         utl_file.get_line(inf,v_line);   --获取记录
  select convert(v_line,'AL32UTF8','ZHS16GBK') into v_line from dual;
          --dbms_output.put_line(v_line);            --打印记录
          --select substr(v_cloumn,0,length(v_cloumn)-1) into v_cloumn from dual;    --截取列最后一位的,
          select   REGEXP_REPLACE( v_line, ',', ''',''')  into v_line   from   dual; --应用正则替换,为','
          -- dbms_output.put_line(v_line);
          --v_sql:='insert into '|| v_tname || '(' || v_cloumn || ') values  ('''|| v_line ||''')';--拼SQL插入语句
          v_sql:=v_sql||' select ''' || v_line ||''' from dual union all ' ;   --拼SQL插入语句
          --dbms_output.put_line(v_sql);   --打印记录
      exception   --异常
       when no_data_found   then  exit ;   --如果读不到记录就exit
      end;
    end loop;
    l_cur :=dbms_sql.open_cursor;
    dbms_sql.parse(l_cur,'delete from '|| v_tname,dbms_sql.native);
    v_num:=dbms_sql.execute(l_cur);
    dbms_sql.close_cursor(l_cur);
    --commit;
    l_cur :=dbms_sql.open_cursor;   --打开动态游标
    select substr(v_sql,0,length(v_sql)-10) into v_sql from dual;   --截取拼好的SQL( union all )
    dbms_sql.parse(l_cur,v_sql,dbms_sql.native);   --检察SQL是否正确
    v_num:=dbms_sql.execute(l_cur);   --执行插入语句
    commit;   --提交
    dbms_sql.close_cursor(l_cur);   --关闭游标
    utl_file.fclose(inf);   --关闭读写流
    dbms_output.put_line('写入成功');   --打印信息
    --exception
--when others then
--dbms_output.put_line('写入失败');
--rollback;
--utl_file.fclose(inf);
end p_imp;
//------------------
set serveroutput on;
//--------------------
exec p_imp('test.csv');
分享到:
评论

相关推荐

    oracle读写分离(中间键Mycat)

    对于`ojdbc7.rar`,这是Oracle JDBC驱动程序的归档文件,它允许Java应用程序连接到Oracle数据库。我们需要将其解压并将驱动类添加到Java的类路径中,以便Mycat可以使用。可以这样操作: ```bash unzip ojdbc7.rar ...

    Oracle存储过程读写文件[文].pdf

    接下来,我们可以创建一个存储过程来实现文件的读写。以下是一个示例存储过程,名为V3_SUB_FETCH_TEST_2,它将查询结果写入文件: 1. 在这个存储过程中,首先定义了一些变量,如V_TEMP(用于存储文件路径)、v_...

    oracle读写分离.docx

    ### Oracle读写分离详解 #### 一、读写分离概念 **读写分离**是一种数据库设计模式,旨在通过将数据库的读操作与写操作分开,从而优化系统的整体性能。这种模式下,通常会有两个或多个数据库实例:一个主数据库...

    C#连接ORACLE,读写,增删改查全。

    - 安装完成后,需要在C#项目中引用Oracle相关的DLL文件,例如`Oracle.DataAccess.dll`。 2. **建立连接** - 使用`OracleConnection`类创建数据库连接。在C#中,你可以创建一个实例,然后设置ConnectionString属性...

    用java编程将txt文件数据导入oracle

    "Java编程将TXT文件数据导入Oracle数据库" Java 编程将 TXT 文件数据导入 Oracle 数据库是指使用 Java 语言编写程序将 TXT 文件中的数据导入 Oracle 数据库中,以方便进行计算、统计等操作。下面将详细介绍该知识...

    oracle blob 字段 读写 delphi

    Oracle数据库中的BLOB(Binary Large Object)字段是用来存储大量二进制数据的,例如图片、文档或音频文件。在Delphi编程环境中,处理这类数据时需要掌握特定的API调用和方法。本篇文章将深入探讨如何在Delphi中对...

    oracle blob的读写(plsql)

    oracle中用来存储大数据的BLOB(图片,文本,文件等)的 读写与复制方法

    oracle案例:VC下的Oracle数据库读写操作案例

    本案例将深入探讨如何在VC环境下进行Oracle数据库的读写操作,帮助开发者更好地理解和应用相关技术。 首先,要进行Oracle数据库操作,我们需要安装Oracle的客户端软件,如Instant Client,它包含了连接数据库所需的...

    Oracle存取文件

    ### Oracle存取文件知识点 #### 一、Oracle Blob数据类型简介 在Oracle数据库中,Blob(Binary Large Object)是一种专门用于存储二进制大数据的对象类型,它可以有效地存储诸如图像、音频文件、视频文件以及任何其他...

    ORACLE配置文件优化

    5. **数据库性能调优**:这不仅包括配置文件优化,还包括SQL查询优化、表分区、物化视图、索引覆盖、读写分离等多方面。例如,通过EXPLAIN PLAN分析SQL执行计划,找出性能瓶颈;使用绑定变量减少解析开销;考虑采用...

    jsp+js+oracle 实现文件上传数据库,下载到本地

    4. JDBC:通过Java与Oracle数据库交互,读写BLOB数据。 5. HTTP响应头:设置正确的响应头,指示文件类型和下载行为。 6. 安全性:防止文件上传攻击,确保下载过程的安全。 理解并掌握这些技术,可以有效地实现在Web...

    Postgresql连接oracle驱动并实现读写

    ### Postgresql连接Oracle数据库并通过oracle_fdw驱动实现读写操作 #### 一、概述 本文档将详细介绍如何在CentOS 6.2环境下通过PostgreSQL 9.5.6使用`oracle_fdw`驱动程序来连接Oracle 11.2客户端,并实现数据的...

    如何实现Oracle数据库的读写分离

    Oracle数据库的读写分离是一种优化数据库性能的策略,它通过将读取操作和写入操作分配到不同的数据库实例,以提高系统的服务能力并减轻主数据库的压力。在Oracle环境中,实现读写分离的方法多种多样,包括但不限于...

    HYZ数据库文件读写控件

    《HYZ数据库文件读写控件详解》 在软件开发过程中,如何有效地管理和存取非结构化数据,如图片、声音和其他文件,是一项重要的任务。HYZ数据库文件读写控件便是为此目的而设计的工具,它使得开发者可以便捷地将这些...

    oracle最新OCI文件.zip

    7. **LOB处理**:Oracle OCI还支持大对象(LOB)的操作,如读写BLOB(二进制大对象)和CLOB(字符大对象)。 8. **预编译的SQL语句**:`OCIPstmtPrepare()`和`OCIPStmtExecute()`用于预编译和执行SQL语句,提高性能...

    Oracle数据库优化之数据库磁盘IO

    在优化数据库磁盘IO时,需要监控数据库的性能,检查系统的I/O问题,使用V$FILESTAT确定oracle文件I/O的进程,分布I/O减少磁盘竞争,避免动态空间管理,确定动态扩展,分配分区,避免回滚段的动态空间管理,减少迁移...

    C#访问oracle数据库类,带blob字段读写

    本篇文章将深入探讨如何使用C#语言访问Oracle数据库,并重点讲解处理Blob(Binary Large Object)字段的读写操作。 首先,让我们理解C#访问Oracle数据库的基本原理。Oracle数据库提供了一个名为ODP.NET(Oracle ...

    oracle中utl_file包读写文件操作实例学习

    Oracle中的UTL_FILE包是一个非常实用的工具,它允许数据库用户在Oracle服务器上进行文件的读写操作。这个包提供了多种函数和过程,使得在PL/SQL中处理文本文件变得简单。下面我们将深入探讨如何使用UTL_FILE进行文件...

    oracle,weblogic读写blob

    本篇文章将深入探讨如何在 Oracle 数据库与基于 WebLogic 的应用中读写 BLOB 数据。 首先,Oracle 数据库提供了多种操作 BLOB 值的方法。在 SQL 查询中,你可以使用 `SELECT BLOB_COLUMN FROM TABLE` 来读取 BLOB ...

Global site tag (gtag.js) - Google Analytics