【问题标题】:Execute scripts by relative path in Oracle SQL Developer在 Oracle SQL Developer 中按相对路径执行脚本
【发布时间】:2014-07-23 01:09:45
【问题描述】:

首先,这个问题与 Oracle SQL Developer 3.2 相关,而不是 SQL*Plus 或 iSQL 等。我进行了大量搜索,但没有找到直接答案。

我有几个我正在尝试自动化的脚本集合(顺便说一句,我的 SQL 经验非常基础,并且主要基于 MS)。我遇到的麻烦是通过相对路径执行它们。例如,假设这样的设置:

scripts/A/runAll.sql
       | /A1.sql
       | /A2.sql
       |
       /B/runAll.sql
         /B1.sql
         /B2.sql

我想要一个文件scripts/runEverything.sql 像这样:

@@/A/runAll.sql
@@/B/runAll.sql

脚本/A/runAll.sql:

@@/A1.sql
@@/A2.sql

据我所知,"@@" 表示 SQL*Plus 中的相对路径。

我一直在制作变量,但运气不佳。我已经能够使用'&1' 并传入根目录来做类似的事情。 IE。: 脚本/runEverything.sql:

@'&1/A/runAll.sql' '&1/A'
@'&1/B/runAll.sql' '&1/B'

并通过执行这个来调用它:

@'c:/.../scripts/runEverything.sql' 'c:/.../scripts'

但这里的问题是 B/runAll.sql 被调用路径为:c:/.../scripts/A/B

那么,是否可以使用 SQL Developer 进行嵌套调用,以及如何进行?

【问题讨论】:

    标签: sql oracle oracle-sqldeveloper relative-path sql-scripts


    【解决方案1】:

    这不是绝对或相对路径问题。这是 SQL 解释器问题,默认情况下它会查找具有 .sql 扩展名的文件。

    请务必将文件名修改为file_name.sql

    例如:如果工作区的文件名为“A”,则将文件从 A 移动到“A.sql”

    【讨论】:

      【解决方案2】:

      如何在文件中传递参数

      @A1.sql; (参数)

      @A2.sql; (参数)

      【讨论】:

        【解决方案3】:

        Sql的执行

        @yourPath\yourFileName.sql
        

        【讨论】:

          【解决方案4】:

          你需要提供文件的路径为 String ,用双引号给出补丁它会起作用

          **

          例如 @"C:\Users\Arpan Saini\Zions R2\Reports Statements and Notices\Patch\08312017_Patch_16.2.3.17\DB Scripts\snsp.sql";

          **

          【讨论】:

            【解决方案5】:

            这种方法有两个组成部分:

            -将活动的 SQL Developer 工作表的文件夹设置为默认目录。

            -打开一个驱动脚本,例如runAll.sql,(然后将默认目录更改为活动目录),并使用 runAll.sql 脚本中的相对路径来调用同级脚本。

            1. 设置您的脚本默认文件夹。在 SQL Developer 工具栏上,使用此导航:

              工具 > 首选项

              在首选项对话框中,导航到数据库 > 工作表 > 选择默认路径以查找脚本。

              输入默认路径以查找脚本作为活动工作目录:

              "${file.dir}"

            2. 创建一个脚本文件并将所有相关的脚本放入其中:

              runAll.sql

              A1.sql

              A2.sql

              runAll.sql 的内容包括:

              @A1.sql;

              @A2.sql;

            要测试此方法,请在 SQL Developer 中单击文件并导航并打开 script\runAll.sql 文件。

            接下来,全选(在工作表上),然后执行。

            通过导航和打开runAll.sql 工作表的行为,默认文件夹变为“脚本”。

            【讨论】:

            • 感谢您的回复,帕特里克。我想你是在建议我设置一个特定的默认文件夹(例如“C:\users\me\scripts”),是吗?我试图避免这种情况,这样我就可以向我的同事提供一个独立的包,他们可以按原样运行。或者您的建议是否旨在有效地将“./”添加到搜索路径?如果是这样,我试了一下(都带引号和不带引号),但总是得到“无法打开文件:”错误。我错过了什么吗?
            • 修改了我的回答,表明这种方法将活动工作表的文件夹作为默认文件夹,并提供了如何执行同级脚本(在同一个文件中)的具体指导。
            • 回答您的问题。是的,我正在设置一个默认文件夹,但默认文件夹是活动文件夹(与工作表相关联......我们正在制作驱动程序脚本)。这将是独立的。
            • 我终于有机会尝试这个,它就像你说的那样有效。 (我认为我之前的尝试受到 SQL 语法错误的困扰)。因此,虽然它不会让每一层的每一块都完全模块化,但它确实让整个包装独立存在。再次感谢!
            【解决方案6】:

            我现在无法访问 SQL Developer,所以我无法尝试使用相对路径,但是对于替换变量,我相信您看到的问题是位置变量(即 &1)是由每个 start@ 重新定义。因此,在您的第一个 @runAll 之后,父脚本看到的 &1 与最后一个子脚本看到的相同,现在包括 /A

            您可以通过在主脚本中定义自己的变量来避免这种情况:

            define path=&1
            @'&path/A/runAll.sql' '&path/A'
            @'&path/B/runAll.sql' '&path/B'
            

            只要runAll.sql 和任何运行的东西都不能(重新定义)path,这应该可以工作,如果存在冲突的风险,您只需要选择一个唯一的名称。

            再次,我无法验证这一点,但我确定我过去确实这样做过......

            【讨论】:

            • 谢谢亚历克斯!我自己也刚刚想通了。 :) 所以他们现在正在工作,虽然不是一个非常漂亮的解决方案。
            猜你喜欢
            • 2019-06-24
            • 2020-03-27
            • 1970-01-01
            • 1970-01-01
            • 2012-05-11
            • 2012-05-12
            • 1970-01-01
            • 2012-10-19
            • 1970-01-01
            相关资源
            最近更新 更多