【问题标题】:SQL Plus change current directorySQL Plus 更改当前目录
【发布时间】:2010-10-05 06:35:53
【问题描述】:

如何在windows下更改SQL Plus中的当前目录。

我正在尝试使用几个“@filename”命令编写脚本。

我知道可以使用 File --> Open 命令打开脚本,这将更改当前目录,但我正在寻找一种自动无人值守的方法。


分辨率

根据 Plasmer 的回复,我在 Windows 中设置了 SQLPATH 环境变量,并得到了对我来说足够好的东西。我没有尝试用 HOST 命令设置它(我怀疑它会起作用)。

Pourquoi Litytestdata 的答案很好,但对我不起作用(目录相距太远)。当然,盖伊关于无法完成的回答也是正确的。我会投票给这两个,并接受 Plasmer 的回答。

【问题讨论】:

  • 对于所有遇到此问题的人,请特别注意汤姆的回答。这很可能是问题所在。在运行“sqlplus”命令之前,您必须在 Windows 中使用“cd”命令。 cd 应该将目录更改为包含要运行的脚本的目录。

标签: oracle sqlplus


【解决方案1】:

这就是我的工作。

定义一个变量来帮助你:

define dir=C:\MySYSTEM\PTR190\Tests\Test1

@&dir\myTest1.sql

您不能在 SQL*Plus 中cd(您可以使用 host 命令cd,但由于它是子进程,因此该设置不会保留在您的父进程中)。

【讨论】:

  • 不错的简单解决方案。不过小更新...您需要在“dir”和“C:\...”之间添加一个“=”
【解决方案2】:

我不认为您可以更改 SQL*Plus 中的目录。

您可以使用@@filename 而不是更改目录,它会读入另一个脚本,该脚本的位置与当前脚本正在运行的目录相关。例如,如果您有两个脚本

C:\Foo\Bar\script1.sql C:\Foo\Bar\Baz\script2.sql

那么script1.sql 可以运行script2.sql 如果它包含该行

@@Baz\script2.sql

有关@@ 的更多信息,请参阅this

【讨论】:

  • @@ 仅在 script2 与 script1 位于同一目录时对我有效。您链接的文本还显示“@@ 将启动一个 sqlplus 脚本,该脚本与调用它的脚本位于同一目录中”。你给出的例子真的对你有用吗?
  • @Karl:如果您使用正斜杠而不是反斜杠,@@ 是否有效?
  • -1 因为它只适用于 sqlplus 从 C:\Foo\Bar 启动的特殊情况。从任何其他目录启动,命令将失败并显示“SP2-0310:无法打开文件”
【解决方案3】:

您能否使用 SQLPATH 环境变量告诉 sqlplus 在哪里查找您尝试运行的脚本?我相信您也可以使用 HOST 在脚本中设置 SQLPATH。

如果两个脚本具有相同的名称并且两个目录都在 SQLPATH 中,则可能会出现问题。

【讨论】:

    【解决方案4】:

    我不认为你可以!

    /home/export/user1 $ sqlplus / 
    > @script1.sql
    > HOST CD /home/export/user2
    > @script2.sql
    

    script2.sql 必须在/home/export/user1

    您要么使用完整路径,要么退出脚本并从正确的目录重新启动sqlplus

    #!/bin/bash
    oraenv .
    cd /home/export/user1
    sqlplus / @script1.sql
    cd /home/export/user2
    sqlplus / @script2.sql
    

    (类似的东西 - 凭记忆这样做!)

    【讨论】:

    • script2.sql 必须在 /home/export/user:你的意思是 /home/export/user1 (错字?) ?
    • @HansDeragon - Blimey,一个(近)10 岁的错字!
    • 从正确的目录启动 sqlplus。什么概念! :)
    【解决方案5】:

    使用 Oracle 的新 SQLcl,现在有一个 cd 命令和随附的 pwd。 SQLcl 可以在这里下载:http://www.oracle.com/technetwork/developer-tools/sqlcl/overview/index.html

    这是一个简单的例子:

    SQL>pwd
    /Users/klrice/
    NOT_SAFE>!ls *.sql
    db_awr.sql  emp.sql     img.sql     jeff.sql    orclcode.sql    test.sql
    db_info.sql fn.sql      iot.sql     login.sql   rmoug.sql
    
    SQL>cd sql
    SQL>!ls *.sql
    003.sql             demo_worksheet_name.sql     poll_so_stats.sql
    1.sql               dual.sql            print_updates.sql
    
    SQL>
    

    【讨论】:

      【解决方案6】:

      您是否尝试过为 sql plus 创建 Windows 快捷方式并设置工作目录?

      【讨论】:

        【解决方案7】:

        我认为 SQLPATH 环境变量是最好的方法 - 如果您有多个路径,请输入以分号 (;) 分隔的路径。请记住,如果目录中存在同名的脚本文件,遇到的第一个(按路径输入的顺序)将被执行,第二个将被忽略。

        【讨论】:

          【解决方案8】:

          几年后我遇到了同样的问题。我的解决方案是创建一个临时批处理文件和另一个 sqlplus 实例:

          在第一个 SQL 脚本中:

          :
          set echo off
          spool sqlsub_tmp.bat
          prompt cd /D D:\some\dir
          prompt sqlplus user/passwd@tnsname @second_script.sql
          spool off
          host sqlsub_tmp.bat
          host del sqlsub_tmp.bat
          :
          

          请注意,“second_script.sql”如果要返回第一个,则需要在末尾添加一个“exit”语句。..

          【讨论】:

          • 我经常使用echo exit | sqlplus ...
          【解决方案9】:

          对我来说,shelling-out 可以完成这项工作,因为它可以让您在 shell 上运行 [a|any] 命令:

          http://www.dba-oracle.com/t_display_current_directory_sqlplus.htm

          总之看当前目录:

          !pwd

          改变它

          !cd /path/you/want

          【讨论】:

          • 正如汤姆在上面已经说过的,盖伊通过实验证实,这是行不通的。您的“任何”命令在 shell 子进程中运行,并会影响它,但不会影响 sql*plus。
          猜你喜欢
          • 2010-12-22
          • 1970-01-01
          • 2017-01-04
          • 1970-01-01
          • 1970-01-01
          • 2011-12-05
          • 2014-12-02
          • 2015-02-22
          • 1970-01-01
          相关资源
          最近更新 更多