从数据库读记录写入文件中
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');
分享到:
相关推荐
对于`ojdbc7.rar`,这是Oracle JDBC驱动程序的归档文件,它允许Java应用程序连接到Oracle数据库。我们需要将其解压并将驱动类添加到Java的类路径中,以便Mycat可以使用。可以这样操作: ```bash unzip ojdbc7.rar ...
接下来,我们可以创建一个存储过程来实现文件的读写。以下是一个示例存储过程,名为V3_SUB_FETCH_TEST_2,它将查询结果写入文件: 1. 在这个存储过程中,首先定义了一些变量,如V_TEMP(用于存储文件路径)、v_...
### Oracle读写分离详解 #### 一、读写分离概念 **读写分离**是一种数据库设计模式,旨在通过将数据库的读操作与写操作分开,从而优化系统的整体性能。这种模式下,通常会有两个或多个数据库实例:一个主数据库...
- 安装完成后,需要在C#项目中引用Oracle相关的DLL文件,例如`Oracle.DataAccess.dll`。 2. **建立连接** - 使用`OracleConnection`类创建数据库连接。在C#中,你可以创建一个实例,然后设置ConnectionString属性...
"Java编程将TXT文件数据导入Oracle数据库" Java 编程将 TXT 文件数据导入 Oracle 数据库是指使用 Java 语言编写程序将 TXT 文件中的数据导入 Oracle 数据库中,以方便进行计算、统计等操作。下面将详细介绍该知识...
Oracle数据库中的BLOB(Binary Large Object)字段是用来存储大量二进制数据的,例如图片、文档或音频文件。在Delphi编程环境中,处理这类数据时需要掌握特定的API调用和方法。本篇文章将深入探讨如何在Delphi中对...
oracle中用来存储大数据的BLOB(图片,文本,文件等)的 读写与复制方法
本案例将深入探讨如何在VC环境下进行Oracle数据库的读写操作,帮助开发者更好地理解和应用相关技术。 首先,要进行Oracle数据库操作,我们需要安装Oracle的客户端软件,如Instant Client,它包含了连接数据库所需的...
### Oracle存取文件知识点 #### 一、Oracle Blob数据类型简介 在Oracle数据库中,Blob(Binary Large Object)是一种专门用于存储二进制大数据的对象类型,它可以有效地存储诸如图像、音频文件、视频文件以及任何其他...
5. **数据库性能调优**:这不仅包括配置文件优化,还包括SQL查询优化、表分区、物化视图、索引覆盖、读写分离等多方面。例如,通过EXPLAIN PLAN分析SQL执行计划,找出性能瓶颈;使用绑定变量减少解析开销;考虑采用...
4. JDBC:通过Java与Oracle数据库交互,读写BLOB数据。 5. HTTP响应头:设置正确的响应头,指示文件类型和下载行为。 6. 安全性:防止文件上传攻击,确保下载过程的安全。 理解并掌握这些技术,可以有效地实现在Web...
### Postgresql连接Oracle数据库并通过oracle_fdw驱动实现读写操作 #### 一、概述 本文档将详细介绍如何在CentOS 6.2环境下通过PostgreSQL 9.5.6使用`oracle_fdw`驱动程序来连接Oracle 11.2客户端,并实现数据的...
Oracle数据库的读写分离是一种优化数据库性能的策略,它通过将读取操作和写入操作分配到不同的数据库实例,以提高系统的服务能力并减轻主数据库的压力。在Oracle环境中,实现读写分离的方法多种多样,包括但不限于...
《HYZ数据库文件读写控件详解》 在软件开发过程中,如何有效地管理和存取非结构化数据,如图片、声音和其他文件,是一项重要的任务。HYZ数据库文件读写控件便是为此目的而设计的工具,它使得开发者可以便捷地将这些...
7. **LOB处理**:Oracle OCI还支持大对象(LOB)的操作,如读写BLOB(二进制大对象)和CLOB(字符大对象)。 8. **预编译的SQL语句**:`OCIPstmtPrepare()`和`OCIPStmtExecute()`用于预编译和执行SQL语句,提高性能...
在优化数据库磁盘IO时,需要监控数据库的性能,检查系统的I/O问题,使用V$FILESTAT确定oracle文件I/O的进程,分布I/O减少磁盘竞争,避免动态空间管理,确定动态扩展,分配分区,避免回滚段的动态空间管理,减少迁移...
本篇文章将深入探讨如何使用C#语言访问Oracle数据库,并重点讲解处理Blob(Binary Large Object)字段的读写操作。 首先,让我们理解C#访问Oracle数据库的基本原理。Oracle数据库提供了一个名为ODP.NET(Oracle ...
Oracle中的UTL_FILE包是一个非常实用的工具,它允许数据库用户在Oracle服务器上进行文件的读写操作。这个包提供了多种函数和过程,使得在PL/SQL中处理文本文件变得简单。下面我们将深入探讨如何使用UTL_FILE进行文件...
本篇文章将深入探讨如何在 Oracle 数据库与基于 WebLogic 的应用中读写 BLOB 数据。 首先,Oracle 数据库提供了多种操作 BLOB 值的方法。在 SQL 查询中,你可以使用 `SELECT BLOB_COLUMN FROM TABLE` 来读取 BLOB ...