使用Expect和命名管状远程控制SQL*Plus
2008-12-17 13:06:03 来源:WEB开发网在初始化一个SQL*Plus会话的时候,对shell的访问会受到HOST命令和运行存储的SQL*Plus脚本的限制。SQL*Plus不具有别名(alias)或者历史等特性,也不具备把一个命令的输出通过管道传入别的命令的能力。如果能将SQL*Plus的特性添加到现有的shell环境中岂不是一件美事?这里正好有一种方法可以实现这一想法。
在UNIX中,创建一个守护进程来将命令从独立的shell命令传入一个SQL*Plus会话是可能实现的。第一步是创建一样能与SQL*Plus交互环境进行交互的东西。虽然SQL*Plus是可交互的,但是它仅限于STDOUT和STDIN,所以它可以放入一个管道中:
sqlplus /nolog < commands.sql > output.log
然而,如果我们想一次发出一条SQL*Plus命令,那么就需要检查SQL*Plus命令提示符“SQL>”来判断SQL*Plus是否在等待输入,然后使用非阻塞管道,这样我们可以在遇到提示符时停止读取数据而等待SQL*Plus更多的输入。
一种天生可以完成这项工作的脚本描述语言是Expect,它是Tcl/Tk程序设计语言的衍生物。这个进程可以是守护进程或者是服务进程,它接收单个的远程控制命令并将它们传递给从属SQL*Plus会话。要与这个服务进程通信,用法最简单的协议是UNIX Domain Protocol(UDP) sockets。shell可以通过UDP客户端发出命令,然后命令由服务进程接收,然后其结果就通过socket发回到客户端。
Expect需要一个扩展才能够使用UDP sockets。与其安装该扩展到Expect,不如在Perl中使用Expect,因为Perl已经能够很好地处理sockets。在Perl归档中可以找到Expect.pm。这个程序提供在Perl中使用Expect相同的功能。
下面是我的简单示例服务程序,使用Perl、UDP和Expect.pm作为我的行程控制服务程序:
更多精彩
赞助商链接