最初に、この質問は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
scripts/A/runAll.sql:
@@/A1.sql
@@/A2.sql
"@@"
は、SQL * Plusでの相対パスを意味します。
私は変数を作ることでだまされましたが、あまり運がありませんでした。 '&1'
を使用してルートディレクトリに渡すことで、同様のことを行うことができました。つまり、scripts/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を使用、およびその方法は?
このアプローチには2つのコンポーネントがあります。
-アクティブなSQL Developerワークシートのフォルダをデフォルトディレクトリとして設定します。
-ドライバスクリプトを開きます。 runAll.sql(これにより、デフォルトのディレクトリがActive Directoryに変更されます)。runAll.sqlスクリプト内の相対パスを使用して、兄弟スクリプトを呼び出します。
スクリプトのデフォルトフォルダを設定します。 SQL Developerツールバーで、次のナビゲーションを使用します。
ツール>設定
設定ダイアログボックスで、[データベース]> [ワークシート]> [デフォルトのパスを選択]に移動して、スクリプトを探します。
デフォルトのパスを入力して、アクティブな作業ディレクトリとしてスクリプトを検索します。
「$ {file.dir}」
スクリプトファイルを作成し、それに関連付けられたすべてのスクリプトを配置します。
runAll.sql
A1.sql
A2.sql
RunAll.sqlの内容は次のとおりです。
@ A1.sql;
@ A2.sql;
このアプローチをテストするには、SQL Developerで[ファイル]をクリックし、script\runAll.sqlファイルに移動して開きます。
次に、すべて(ワークシート上)を選択して実行します。
RunAll.sqlワークシートをナビゲートして開くことにより、デフォルトのファイルフォルダーは「スクリプト」になります。
ファイルのパスをStringとして指定する必要があります。パッチが機能するように二重引用符で囲みます。
**
例@ "C:\ Users\Arpan Saini\Zions R2\Reports Statements and Notices\Patch\08312017_Patch_16.2.3.17\DB Scripts\snsp.sql";
**
現在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
しない限り、これは機能し、衝突のリスクがある場合は、一意の名前を選択する必要があります。
繰り返しますが、これを確認することはできませんが、過去にこれを正確に実行したことがあると確信しています...
これは絶対パスまたは相対パスの問題ではありません。これはSQLインタープリターの問題であり、デフォルトでは.sql拡張子を持つファイルを探します。
必ずファイル名をfile_name.sqlに変更してください
例:ワークスペースに「A」というファイル名がある場合、ファイルをAから「A.sql」に移動します。
SQLの実行
@yourPath\yourFileName.sql