如何通过 sql plus 从命令行发出单个命令?
Posted
技术标签:
【中文标题】如何通过 sql plus 从命令行发出单个命令?【英文标题】:How can I issue a single command from the command line through sql plus? 【发布时间】:2010-10-12 22:16:43 【问题描述】:使用 SQL Plus,您可以从命令行运行带有“@”运算符的脚本,如下所示:
c:\>sqlplus username/password@databasename @"c:\my_script.sql"
但是是否可以只运行具有类似语法的单个命令,而不需要整个单独的脚本文件?如:
c:\>sqlplus username/password@databasename @execute some_procedure
我对此感兴趣,因为我想编写一个简单地执行命令的批处理文件,而不生成一堆两行的“.sql”文件。
【问题讨论】:
【参考方案1】:你尝试过这样的事情吗?
sqlplus username/password@database < "EXECUTE some_proc /"
似乎在 UNIX 中你可以这样做:
sqlplus username/password@database <<EOF
EXECUTE some_proc;
EXIT;
EOF
但我不确定 windows 相当于什么。
【讨论】:
注意,在 unix(可能还有 windows)上,您真的不应该使用用户名/密码语法,因为这会将您的密码暴露给系统上的每个用户。如果需要,请使用外部身份验证。 该命令行将对其他操作系统用户可见(例如)ps -ef
,如果您必须包含用户名和密码,最好执行“sqlplus /nolog ps -ef的输出中公开明文用户名和密码【参考方案2】:
我可以通过将 SQL 查询通过管道传输到 SQL*Plus 来运行它:
@echo select count(*) from table; | sqlplus username/password@database
给予
@echo execute some_procedure | sqlplus username/password@databasename
试一试。
【讨论】:
这种情况下echo前面的@符号是做什么的? @IvanG;对于 Windows 批处理文件,命令前的 @ 符号会阻止命令回显到控制台。它在您不想关闭回显但又不想看到命令在屏幕上回显的情况下很有用。在这种情况下,需要它以便通过管道传递给 sqlplus 命令的是我们要运行的 SQL,而不是命令文本。【参考方案3】:sqlplus user/password@sid < sqlfile.sql
这也适用于 DOS 命令行。在这种情况下,文件 sqlfile.sql 包含您要执行的 SQL。
【讨论】:
OP 已经说过他知道他可以做到这一点。他正在寻求一种无需单独的 SQL 脚本即可运行单个命令的方法。【参考方案4】:这就是我解决问题的方法:
<target name="executeSQLScript">
<exec executable="sqlplus" failonerror="true" errorproperty="exit.status">
<arg value="$dbUser/$dbPass@<DBHOST>:<DBPORT>/<SID>"/>
<arg value="@$basedir/db/scripttoexecute.sql"/>
</exec>
</target>
【讨论】:
更具体地描述您的答案在哪里设置以及如何修复错误等。 Apache Ant 中的这个解决方案仍然需要一个与调用脚本分开存储的 SQL 脚本scripttoexecute.sql
。【参考方案5】:
对于 UNIX (AIX):
export ORACLE_HOME=/oracleClient/app/oracle/product/version
export DBUSER=fooUser
export DBPASSWD=fooPW
export DBNAME=fooSchema
echo "select * from someTable;" | $ORACLE_HOME/bin/sqlplus $DBUSER/$DBPASSWD@$DBNAME
【讨论】:
【参考方案6】:@find /v "@" < %0 | sqlplus -s scott/tiger@orcl & goto :eof
select sysdate from dual;
【讨论】:
请添加更多细节做你的回答。以上是关于如何通过 sql plus 从命令行发出单个命令?的主要内容,如果未能解决你的问题,请参考以下文章
当程序路径包含空格时,SQL*plus 不会正确标记其命令行参数