中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > Oracle
利用数据库效用给Unix命名管道详解
作者:kingguo 时间:2007-06-15 17:18 出处:ccidnet.com 责编:月夜寒箫
              摘要:利用数据库效用给Unix命名管道详解

大多数Oracle效用,比如导出,导入和SQL*装入程序,但是我们通常会直接使用标准的输入和输出。这个是UNIX 的一个问题,因为大多数时候UNIX都默认或者通过特殊选择允许你使用标准的输入或者输出。

为了接受标准的输入输出,允许你使用链式命令,比如:

 

  
              tar cvf - dir | gzip > file.tar.gz
              gunzip < file.tar.gz | tar -xvf –
  

这些命令不需要中介文件因为管道的读或者写数据都在不同的线程中。一个管道事实上只是一个记忆的缓冲器,它接受两个不同进程的读写,这两个进程允许它们从前到后的传送数据。记忆缓冲器通常会限制大小;当它满的时候它会阻止写进程,当它空的时候,它回限制读进程。

它们的优势就是永远不会把内存使用光也不会需要任何磁盘存储。当你没有空间存储非压缩版本的时候,上面的例子将允许你存储一个文档的压缩版本。

Oracle的导出和导入不能直接引用标准的输出和输入。但是,一个命名的小窍门允许你完成这个命令。一个命名的管道是一个UNIX文件的操作它影射到操作系统的管道中。

为了创造命名管道,你可以使用p选项来执行mknod命令。习惯上我们可以这么写:mknod -p ;另外,在Linux中,我们这么书写:mknod p.大多数的系统效用中,管道的结果就好像顺序文件,比如,压缩用户的导出文件:

 

  
              mknod /tmp/mypipe p
              exp userid=scott/tiger file=/tmp/mypipe &
              gzip < /tmp/mypipe > exp.dat.gz
              rm /tmp/mypipe
  

根据我的测试,压缩导出文件只是普通大小的八分之一:

 

  
              mknod /tmp/mypipe p
              imp userid=scott/tiger file=/tmp/mypipe &
              gunzip < exp.dat.gz > /tmp/mypipe
              rm /tmp/mypipe
  

SQL*的装载程序是另外一个效用,它可以使用这个技巧。SQL*装入程序可以接受输入输出的数据。比如,你可以创建一个表格捕获输出:

 

  
              drop table lsout;
              create table lsout
              (
                attrs    char(10),
                links    integer,
                owner    varchar2(8),
                grpname   varchar2(8),
                filesize  integer,
                crdate   date,
                filename  varchar2(256)
              );
  

为了检测输出,可以使用SQL*装入程序控制文件:

 

  
              load data
              truncate
              into table lsout
              (
                attrs    position(01:10),
                links    position(12:15),
                owner    position(17:24),
                grpname   position(26:34),
                filesize  position(36:42),
                crdate   position(44:55) DATE "Mon DD HH24:MI",
                filename  position(57:300)
              )
  

现在,创建一个命名管道,在背景线程中创建SQL*装入程序:

 

  
              #!/bin/csh
              mknod /tmp/mypipe p
              sqlldr userid=scott/tiger control=lsout.ctl data=/tmp/mypipe skip=1 &
              ls -l > /tmp/mypipe
              wait
              cat lsout.log
              rm /tmp/mypipe
  

SQL*装入程序可以装入一个文件到CLOB中,因为命名管道就好像是文件一样,你可以定义命名管道的名字来代替一个文件名并装入输出管道到数据库的CLOB中。

下面来看个例子:

 

  
              create table xml_repository(doc clob);
  

现在,你需要创建SQL*装入程序来控制文件:

 

  
              load data infile *
              truncate into table xml_repository
              fields terminated by whitespace
              (
                pipe filler,
                doc lobfile(pipe) terminated by eof
              )
              begindata
              /tmp/mypipe
  

为了更详细的展示这个技术,这里有一个简单的脚本。这个脚本将把最新的文档进行命名:

 

  
              #!/bin/csh
              mknod /tmp/mypipe p
              wget NOTRACK http://myrss.com/f/c/n/cnnGf9z390.rss -O /tmp/mypipe &
              sqlldr userid=scott/tiger control=xmlload.ctl
              cat xmlload.log
              rm /tmp/mypipe

一旦XML文档在CLOB中,你可以使用任何新的XML导航函数。你可以利用它来做其他的工作。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有