通过 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 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何在 shell 脚本中运行 SQL 查询时获得类似 SQLPLUS 的输出

如何在shell中调SQLPLUS 执行SQL语句

如何在shell中调SQLPLUS 执行SQL语句

从 shell 脚本运行 sqlplus 时管理错误处理

shell脚本执行.sql文件

linux下shell脚本中sqlplus调用shell变量的问题