Oracle写本地文件是指写到运行Oracle的主机上,而不是运行该脚本的机器上。

说起来有点拗口,实际上就是无论在哪里执行这个过程,生成的文件始终都是在服务器上的。

下面过程实现了这个功能:

logdir是指文件存放路径。有Oracle的directory指定:

create or replace directory log_dir  as '/oracle/admin/orcl';

创建带有clob字段的表:

create table testclob(obj_type varchar2(255), obj_content clob);

插入测试数据:

insert into testclob(obj_type, obj_content)

select 'PROCEDURE', dbms_metadata.get_ddl('PROCEDURE', o.object_name)

from dba_objects o

where o.owner = user

and o.object_type = 'PROCEDURE'

创建存储过程:

create or replace procedure sp_writelog2file(logdir varchar2,

filename varchar2,

writemode char := 'W') as

type tbl_result is table of varchar2(2000) index by pls_integer;

v_res tbl_result;

type tbl_clob is table of clob index by pls_integer;

v_clobs   tbl_clob;

v_filename   varchar2(255) := filename;

v_logdir     varchar2(255) := logdir;

v_buffer     pls_integer := 2000;

v_offset     pls_integer := 1;

v_filehandle utl_file.file_type;

function f_readclob(varclob clob)

return tbl_result as

v_maxbuff pls_integer := 2000;

v_cloblen pls_integer := length(varclob);

v_result tbl_result;

v_buffer pls_integer := v_maxbuff;

v_offset pls_integer := 1;

v_nextpos pls_integer := 1;

v_prevpos pls_integer := 1;

v_maxstep pls_integer := 20;

v_nth    pls_integer := v_maxstep;

begin

while v_nextpos <> 0 loop

v_nextpos := dbms_lob.instr(varclob, chr(10), 1, v_nth);

v_buffer  := (case when v_nextpos = 0 then v_cloblen else v_nextpos end) - v_prevpos;

if (v_buffer > v_maxbuff and v_nextpos <> 0) then

v_nth := v_nth - 3;/*超过最大缓冲区,指针退3个*/

elsif (v_buffer < 3*v_maxbuff/4 and v_nextpos <> 0) then

v_nth := v_nth + 3;/*未达最大缓冲区的3/4,指针进3个*/

else

dbms_lob.read(varclob, v_buffer, v_offset, v_result(nvl(v_result.last, 0) + 1));

v_prevpos := v_nextpos;

v_nth := v_nth + v_maxstep;

v_offset := v_offset + v_buffer;

end if;

end loop;

return v_result;

end f_readclob;

begin

v_filehandle := utl_file.fopen(v_logdir, v_filename, writemode);

if(utl_file.is_open(v_filehandle)) then

select t2.obj_content

bulk collect into v_clobs

from testclob t2;

for i in 1 .. v_clobs.count loop

v_res := f_readclob(v_clobs(i));

for j in 1 .. v_res.count loop

utl_file.put_line(v_filehandle, v_res(j));

end loop;

end loop;

end if;

utl_file.fclose(v_filehandle);

exception when others then

utl_file.fclose(v_filehandle);

end sp_writelog2file;

调用存储过程,将testclob的内容写到主机上的文件中:

call sp_writelog2file('LOG_DIR', 'lyon.txt');

对于clob对象的读取,采用了分段截取的算法。截取标识为换行符(chr(10))。

每次步长为20个换行符间隔。假设每次截取长度最大值为N(这里N=2000)。该间隔区间内,如果字符数范围在[N*3/4, N]之间,则直接截取。

如果小于3/4 N长度,则指针标识向前推3个换行符间隔。如果大于N,则向后退3个换行符间隔。保证截取的长度始终在3/4-1个N之间。

oracle 存储过程写文件,Oracle写本地文件相关推荐

  1. mysql与oracle存储过程_MySQL与Oracle差异比较之五存储过程Function

    存储过程&Function 编号 类别 oracle Mysql 注释 1 创建存储过程语句不同 create or replace procedure P_ADD_FAC( id_fac_c ...

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

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

  3. mysql与oracle存储过程_mysql与oracle存储过程对比

    一.创建存储过程语句不同 mysql DROP PROCEDURE IF EXISTS `SD_USER_P_ADD_USR`; create procedure P_ADD_FAC(id_fac_c ...

  4. oracle存储过程输出调试,Oracle存储过程的调试方法

    Oracle存储过程可以根据我们的需求进行调试修改,下面就为您介绍如何修改一个Oracle存储过程的实际操作步骤,供您参考学习. 如果你要执行Oracle存储过程,首先你需要写出一个关于输出的字符串& ...

  5. oracle存储过程游标写法,Oracle存储过程,游标使用

    语法: CREATE [OR REPLACE] PROCEDURE procedure_name (arg1 [mode1] datatype1,arg2 [mode2] datatype2,...) ...

  6. Oracle高人写的Oracle运行原理性文章(zt)

    我们从一个用户请求开始讲,ORACLE的完整的工作机制是怎样的,首先一个用户进程发出一个连接请求,如果使用的是主机命名或者是本地服务命中的主机名使用的是机器名(非IP地址),那么这个请求都会通过DNS ...

  7. c#怎么调用oracle存储过程,C#调用Oracle存储过程的方法

    准备: 环境:pl/sql+oracle9i+vs2008 创建表test: create table TEST ( ID      NUMBER,//编号 NAME    VARCHAR2(10), ...

  8. oracle存储过程sql und,oracle导入sql脚本

    在工作需要的时候,常常忘记很多命令.今天做的时候才记起! 在SQL_PLUS里面执行: sql>@full_path/test.sql; 例:sql>@D:/test.sql; 不需要co ...

  9. oracle存储过程备份,利用ORACLE存储过程与JOB结合实现对数据表自动备份

    烈火网(LieHuo.Net)教程 利用ORACLE存储过程与JOB结合实现对数据表自动备份. 1.创建存储过程 create or replace procedure data_auto_backu ...

最新文章

  1. 【bzoj3150】 cqoi2013—新Nim游戏
  2. ZULUTrade骗局揭秘--一名福汇员工的良心发现
  3. (0012) iOS 开发之MAC 终端命令学习
  4. android升级功能键,Android 按键添加转载
  5. 【Tools】Centos7.5安装MySQL5.7
  6. 牛X,.NET6又双叒叕新版本,这是要起飞吗?
  7. CSS 学习路线(一)元素
  8. 解决 asp.net 伪静态 IIS设置后 真正的HTML无法显示的问题
  9. linux tomcat 进程杀掉_Linux下启动停止查看杀死Tomcat进程
  10. 为移动Web应用创建快速响应按钮
  11. 转:extjs里的fieldset不居中的解决办法(记录)
  12. 团购网站安全性普遍堪忧
  13. php数组和字符串转换
  14. python做积分计算器_PyQt5练习:积分计算器
  15. 案例解读|江苏银行—智多星大数据分析云平台实践
  16. 软件开发全过程必备文档下载(@附所有文档)
  17. 串口波特率自适应算法(仿真通过)
  18. [项目管理-6]:软硬件项目管理 - 项目沟通管理(渠道、方法)
  19. html5考试简答题
  20. 乌班图系统重启服务器,3种重启Ubuntu服务器命令方式技巧

热门文章

  1. Android studio 清除缓存数据的步骤
  2. 【APICloud系列|25】 easeChat模块(环信-即时通讯)的实现
  3. ant vue 兼容性问题_ant design for vue 关于table的一些问题
  4. web前端-回调函数sort详解
  5. 今天发现新大陆:haml和Emmet
  6. 4、Node.js REPL(交互式解释器)
  7. break、continue、return的区别
  8. 【第七次JAVA课,java语法基础】课件总结
  9. [Swift]LeetCode86. 分隔链表 | Partition List
  10. UML学习(一)-----用例图