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

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之间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两数相加c语言实现

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储&#xff0c;它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。示例&#xff1a;输入&#xff1a;(2 -> 4 -> 3) (5 -> 6 -&g…

jQuery获取Select选择的Text和Value

一、 jQuery获取Select选择的Text和Value:语法解释&#xff1a; $("#select_id").change(function(){//code...}); //为Select添加事件&#xff0c;当选择其中一项时触发varcheckText$("#select_id").find("option:selected").tex…

jquery实现导航栏鼠标点击后实行背景高亮,点击离开恢复(超级简单!!!!)...

昨天才写了一个方法&#xff0c;今天发现一个更简单的。 html&#xff1a; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title></title> </head> <body> <div class"dianji&qu…

Linux怎么处理binray文件,Linux下如何反汇编arm raw binary文件

有一个arm elf文件经过objcopy -O binary 命令处理生成bin文件进行反汇编:指令1&#xff1a;arm_v5t_le-objdump -b binary -m armv5te -D u-boot.bin|head指令2&#xff1a;arm-linux-objdump -D -b binary test.bin --architecturearm > /tmp/raw.txthttp://linux.chi…

putty连虚拟机中Linux出现Access Denied

环境&#xff1a;VMwarekali Linux出现这个问题&#xff0c;肯定是你想尝试直接通过使用root账户连接你的linux&#xff0c;这样肯定是不行的&#xff0c;why&#xff1f;为了保证服务器安全&#xff0c;几乎所有的服务器都禁止了超级用户直接登录系统&#xff0c;而是通过普通…

Floyd算法应用-医院选址问题

1)问题描述 n个村庄之间的交通图可以用有向网图来表示&#xff0c;图中边<vi, vj>上的权值表示从村庄i到村庄j的道路长度。现在要从这n个村庄中选择一个村庄新建一所医院&#xff0c;问这所医院应建在哪个村庄&#xff0c;才能使所有的村庄离医院都比较近&#xff1f; 2)…

linux ls 命令排序,如何在Linux中使用ls命令按大小对所有文件进行排序

ls命令是列出目录内容的最流行且非常有用的命令。 在本文中&#xff0c;我们将解释如何使用ls sort选项按大小列出目录内容。1)按大小列出目录中的文件(排序)要列出具有大小排序的特定目录的内容&#xff0c;我们将使用-lS选项和ls命令。 它将在顶部显示最大的文件。[linuxidcl…

C​#​获​取​当​前​时​间​的​各​种​格​式

C#获取当前时间的各种格式 DateTime.Now.ToShortTimeString() DateTime dt DateTime.Now; dt.ToString();//2005-11-5 13:21:25 dt.ToFileTime().ToString();//127756416859912816 dt.ToFileTimeUtc().ToString();//127756704859912816 dt.ToLocalTime().ToString(…

基于tcp connect的端口扫描程序

原理&#xff1a;connect()函数用于对于每一个感兴趣的目标计算机的端口进行连接&#xff0c;如果该端口处于侦听状态&#xff0c;那么connect()就会成功&#xff0c;即没有提供服务。如果对于每一个目标端口以串行的方式使用单独的connect()调用&#xff0c;需要较长的时间&am…

UIScrollView

一、UIScrollView 1.常见属性 property(nonatomic) CGPoint contentOffset; // 记录UIScrollView滚动的位置 property(nonatomic) CGSize contentSize; // 内容尺寸&#xff08;能滚动的范围&#xff09; property(nonatomic) UIEdgeInsets contentInset; // 额外增加的滚动区域…

linux如何运行多个硬盘,一个硬盘如何装两个Linux

1个硬盘已安装Fedora 8 Linux系统&#xff0c;并安装grub引导管理程序&#xff0c;现要在这个硬盘的空闲分区中安装Fedora 9&#xff0c;操作如下&#xff1a;1.将Fedora-9-i386-DVD.iso文件放到一个Windows Fat32分区((hd0,4))的根目录&#xff0c;将这个iso文件中的isolinux目…

APIO2015 酱油记

Day 0 昨天CTSC才比完&#xff0c;当然是要浪啦&#xff01; 于是浪了一天。。。午饭都没吃。。。 晚饭。。。貌似也没吃。。。 晚上的时候觉得这样子浪不太好&#xff0c;还是要认真一下&#xff0c;打开bzoj&#xff0c;弃疗了。。。还是浪吧。。。 Day 1 今天要讲课&#xf…

宏定义 #define 和常量 const 的区别

学习笔记&#xff01;参考链接 一、类型和安全检查不同宏定义是字符替换&#xff0c;没有数据类型的区别&#xff0c;同时这种替换没有类型安全检查&#xff0c;可能产生边际效应等错误&#xff1b;const常量是常量的声明&#xff0c;有类型区别&#xff0c;需要在编译阶段进行…

【ibus】设置ibus输入法(pinyin sunpinyin)

设置ibus-pinyin 在终端中运行 /usr/lib/ibus-pinyin/ibus-setup-pinyin命令可以调出ibus的完整设置对话框 设置ibus-sunpinyin 可以执行ibus-sunpinyin自带的python设置脚本ibus-setup-sunpinyin来全面设置它 : $ /usr/lib/ibus-sunpinyin/ibus-setup-sunpinyin 如果执行此脚…

linux 进程 释放内存,Linux 释放内存方法和原理

今天惊愕地发现&#xff0c;主节点上8G内存被不知道什么进程吃掉了整整6G有余&#xff0c;正常的计算快要维持不下去了&#xff0c;遂处理之。先看看内存使用状况[rootnode1 ~]# free -mtotal used free shared buffers cachedMem: 8004 6557 1446 0 163 5630-/ buffers/cache:…

玩转Win32开发(2):完整的开发流程

上一篇中我给各位说了一般人认为C中较为难的东西——指针。其实对于C&#xff0c;难点当然不局限在指针这玩意儿上&#xff0c;还有一些有趣的概念&#xff0c;如模板类、虚基类、纯虚函数等&#xff0c;这些都是概念性的东西&#xff0c;几乎每一本C书上都会介绍&#xff0c;而…

c++函数传参:值传递、指针传递、引用传递

1、将变量名作为实参和形参&#xff1a; 这时传给形参的是变量的值&#xff0c;传递是单向的。如果在执行函数期间形参的值发生变化&#xff0c;并不传回实参。应为在调用函数时&#xff0c;形参和实参不是同一个存储单元。 2、传递变量的指针&#xff1a; 形参是指针变量&a…

赞!带进度条的 jQuery 文件拖放上传插件

jQuery File Uploader 是一个 jQuery 文件拖放上传插件&#xff0c;包括 Ajax 上传和进度条效果。作者编写这个插件的想法是要保持它非常简单&#xff0c;不像其他的插件&#xff0c;很多的标记&#xff0c;并提供一些 Hack 的方式使之兼容那些古老的浏览器。jQuery File Uploa…

linux系统有几个系统盘,linux操作系统的分区有哪些种类?各分区主要作用是什么?...

满意答案Linux下一切都是文件&#xff0c;不存在分区的概念&#xff0c;在Linux下说的分区只是磁盘管理和数据组织的需要。Linux使用标准的目录结构&#xff0c;在安装的时候&#xff0c;安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式&#xff0c;并指定了每个…

::范围解析运算符

学习笔记&#xff1a;参考链接 ::是范围解析运算符&#xff0c;或者称为域区分符&#xff0c;用来指明一个函数或一个数据属于哪一个类。 ::也可以不跟类名&#xff0c;表示全局函数或者全局数据 eg: #include<iostream> using namespace std;int month;//全局变量 i…