首先,这个问题涉及 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'
执行类似的操作并传入根目录。即:
脚本/ 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 进行嵌套调用是否可能以及如何进行?
答案 0 :(得分:11)
这种方法有两个组成部分:
- 将活动的SQL Developer工作表的文件夹设置为默认目录。
- 打开一个驱动程序脚本,例如runAll.sql,(然后将默认目录更改为活动目录),并使用runAll.sql脚本中的相对路径来调用兄弟脚本。
设置脚本默认文件夹。在SQL Developer工具栏上,使用此导航:
工具>首
在首选项对话框中,导航到数据库>工作表>选择默认路径以查找脚本。
输入默认路径以查找脚本作为活动工作目录:
“$ {file.dir}”
创建一个脚本文件并将所有相关的脚本放在其中:
runAll.sql
A1.sql
A2.sql
runAll.sql的内容包括:
@ A1.sql;
@ A2.sql;
要测试此方法,请在SQL Developer中单击File并导航并打开script \ runAll.sql文件。
接下来,选择all(在工作表上),然后执行。
通过导航和打开runAll.sql工作表的行为,默认文件夹变为“脚本”。
答案 1 :(得分:1)
我现在无法访问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
,这应该有效,如果存在风险,您只需选择一个唯一的名称冲突。
我再也无法对此进行验证,但我确信过去我确实做到了这一点......
答案 2 :(得分:1)
你需要提供文件的路径为String,以双引号给出补丁它将起作用
**
例如 @“C:\ Users \ Arpan Saini \ Zions R2 \ Reports Statements and Notices \ Patch \ 08312017_Patch_16.2.3.17 \ DB Scripts \ snsp.sql”;
**
答案 3 :(得分:0)
这不是绝对或相对路径问题。这是SQL解释器问题,默认情况下它会查找具有.sql扩展名的文件。
请确保将文件名修改为file_name.sql
例如:如果工作空间的文件名称为“A”,则将文件从A移动到“A.sql”
答案 4 :(得分:0)
执行Sql
@yourPath\yourFileName.sql
答案 5 :(得分:0)
如何在文件中传递参数
@ A1.sql; (参数)
@ A2.sql; (参数)