2

重複の可能性:
スクリプトを実行するための SQLplus デコード

私はすべてを見てきましたが、私の質問に対する答えを見つけることができないようですが、私はオラクルに比較的慣れていませんが、データベース/ SQLに精通しているため、私の誤解かもしれません. Linux (ubuntu) で PL/SQL と SQL*Plus を組み合わせて使用​​する Oracle .SQL ファイルを使用して、データベース内の基本的なテーブルに入力しています。1 つの「マスター スクリプト」から呼び出される多数のスクリプトがあります。

たとえば、次のようなマスター スクリプトがあります。

@folder1/script1.sql
@folder2/script2.sql

各スクリプト内で、データベース内のパッケージを呼び出していくつかのフィールドにデータを入力する SQL ステートメントがあります。私ができるようにしたいのは、ユーザーに入力を求めて環境を決定し、その入力に基づいて特定のスクリプトを実行することです。スクリプト内で変数を取得する方法は知っていますが、そうすると、外部スクリプトを呼び出すことができないようです。

たとえば、次のように変数を取得する方法を知っています。

set define on
def &&env=env1

begin

        if '&&env' = 'env1' then
        .
        . 
        .
        .
        END IF;
END;

これにより、ユーザーは希望どおりに変数を入力するように求められますが、上記のように、このブロック内で外部スクリプトを呼び出すことができないようです。私の理解では、これは、Begin/End ブロック内で PL/SQL が実行され、その外側で SQL*Plus が実行されているためです (これについては間違っている可能性がありますが、これも比較的新しいオラクルです)。

オンラインで検索すると、スクリプト内で EXECUTE IMMEDIATE を使用して外部スクリプトを呼び出すことを推奨している人が見つかりましたが、これは悪い習慣と見なされていますが、それを機能させることができます。これは、PL/SQL がサーバー側であるため、スクリプトがサーバー上にある必要があるためだと思います (私の場合は機能しません)。

結局のところ、私が欲しいのはこの効果に機能するものですが、これを行うとうまくいかないようです。

set define on
def &&env=env1

begin

        if '&&env' = 'env1' then
               @folder1\script1.sql
               @folder1\script2.sql
        ELSEIF '&&env' = 'env2'
               @folder2\script1.sql
               @folder2\script2.sql
        END IF;
END;

ただし、上記のコードは機能せず、外部スクリプトを呼び出そうとすると失敗し、これが可能かどうかをオンラインで検索しても何も見つからないようです。

4

0 に答える 0