WEB开发网
开发学院数据库Oracle 使用Expect和命名管状远程控制SQL*Plus 阅读

使用Expect和命名管状远程控制SQL*Plus

 2008-12-17 13:06:03 来源:WEB开发网   
核心提示:在初始化一个SQL*Plus会话的时候,对shell的访问会受到HOST命令和运行存储的SQL*Plus脚本的限制,使用Expect和命名管状远程控制SQL*Plus,SQL*Plus不具有别名(alias)或者历史等特性,也不具备把一个命令的输出通过管道传入别的命令的能力,在Perl归档中可以找到Expect.pm,

在初始化一个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作为我的行程控制服务程序:

1 2 3  下一页

Tags:使用 Expect 命名

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接