通过 sqlplus 运行 shell 脚本
Posted
技术标签:
【中文标题】通过 sqlplus 运行 shell 脚本【英文标题】:RUnning shell script through sqlplus 【发布时间】:2014-06-25 22:47:30 【问题描述】:我在 prod 环境中以 oracle 身份登录,并且我需要在使用 SQLPLUS 时在远程主机上运行 SHELL 脚本。我正在尝试通过 python 做到这一点。有什么办法吗?
我可以从 sqlplus 运行 SQL 脚本或 sql 命令,如下所示:-
session = Popen(['sqlplus','-S','abc/abc@'+str(hostname)+':1000/'+str(dbname)+''], stdin=PIPE, stdout=PIPE, stderr=PIPE)
session.stdin.write('SPOOL '+str(op_file)+' \n'
' '+str(data)+ '\n');
session.stdin.write(' ; \n')
session.stdin.write('exit \n')
session.stdin.flush()
stdout, stderr = session.communicate()
但是当我想运行一个 shell 脚本时,有什么方法可以通过 sqlplus 本身来完成,因为通过 ssh 登录和作为 oracle 的 sudo 的另一种方式是不可能的
我认为这是使用 PLSQL 的方法之一:-
http://www.dba-oracle.com/t_execute_shell_script_plsql_procedure.htm
但不确定。
【问题讨论】:
【参考方案1】:SQL*Plus 是一个客户端应用程序。它可以在客户端机器上生成进程,这些进程将在客户端上运行 shell 脚本。它无法在数据库服务器上生成进程。
正如您所链接的,您可以使用数据库服务器上的dbms_scheduler
包在服务器上生成运行批处理文件的进程。您可以对 Java 存储过程执行类似的操作,因为它也在服务器上运行。 dbms_scheduler
也有能力 run jobs on remote servers 如果安装了适当的调度程序代理,但这似乎不太可能在绝大多数情况下特别有用。
【讨论】:
如果通过pl/sql代码块来做,比如使用os_command.exec(),它还会在本地运行命令吗? @user3638694 - 我不确定“os_command.exec()”是什么意思。你是说你的数据库中有一个包os_command
和一个过程exec
?可能是有人写的。如果是这样,我猜exec
过程正在调用一个 Java 存储过程,该过程按照我在回答中建议的内容执行操作系统命令。如果这就是您所拥有的,那么 Java 存储过程将在数据库服务器上生成进程。
但是这个 java 过程会在本地数据库服务器或我使用 'sqlplus','-S','abc/abc@'+hostname+':1000 连接到的远程数据库服务器上生成进程吗/'+数据库名
@user3638694 - Java 存储过程将在安装了 Java 存储过程的任何数据库服务器上生成进程。如果 Java 存储过程安装在远程数据库服务器上,它将在远程数据库服务器。如果 Java 存储过程安装在本地数据库服务器上,它将在本地数据库服务器上启动一个进程。无论是否安装了数据库服务器,运行 SQL*Plus 的机器都是客户端机器。以上是关于通过 sqlplus 运行 shell 脚本的主要内容,如果未能解决你的问题,请参考以下文章