【问题标题】:How can I issue a single command from the command line through sql plus?如何通过 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”文件。

【问题讨论】:

    标签: oracle command-line sqlplus


    【解决方案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;
      

      【讨论】:

      • 请添加更多细节做你的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      相关资源
      最近更新 更多