sql >> データベース >  >> RDS >> Oracle

シェルスクリプトからsqlplusに変数を渡す方法

    heredocがあるようです コメントに記載されているように正しく見えませんが、単一のSQL*Plusコマンドが含まれています。 heredocに値を渡すことができます :

    sqlplus -S user/[email protected] << EOF
    @/opt/D2RQ/file.sql BUILDING
    exit;
    EOF
    

    またはBUILDING $2です スクリプト内:

    sqlplus -S user/[email protected] << EOF
    @/opt/D2RQ/file.sql $2
    exit;
    EOF
    

    file.sqlの場合 exitがありました 最後に、heredocが必要ないため、さらに簡単になります。 :

    sqlplus -S user/[email protected] @/opt/D2RQ/file.sql $2
    

    SQLでは、置換変数を使用して位置パラメーターを参照できます。

    ...
    }',SEM_Models('&1'),NULL,
    ...
    

    &1 SQLスクリプトに渡される最初の値BUILDINGに置き換えられます;これは文字列であるため、引用符で囲む必要があります。 set verify offすることをお勧めします 出力に置換が表示された場合に停止します。

    複数の値を渡して、シェルスクリプトの位置パラメータと同じように順番に参照できます。最初に渡されるパラメータは&1です。 、2番目は&2 、など。SQLスクリプトのどこでも置換変数を使用できるため、列エイリアスとして問題なく使用できます。リストの最後に追加するパラメータを追加する場合は注意が必要です(これにより、スクリプト内の番号付けが順不同である可能性があります)、または一致するようにすべてを調整します:

    sqlplus -S user/[email protected] << EOF
    @/opt/D2RQ/file.sql total_count BUILDING
    exit;
    EOF
    

    または:

    sqlplus -S user/[email protected] << EOF
    @/opt/D2RQ/file.sql total_count $2
    exit;
    EOF
    

    total_countの場合 シェルスクリプトに渡されているので、その位置パラメータ$4を使用します。 または何でも。そして、SQLは次のようになります。

    SELECT COUNT(*) as &1
    FROM TABLE(SEM_MATCH(
    '{
            ?s rdf:type :ProcessSpec .
            ?s ?p ?o
    }',SEM_Models('&2'),NULL,
    SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL));
    

    多くの値を渡す場合は、位置パラメーターを使用して名前付きパラメーターを定義する方が明確な場合があるため、順序付けの問題はすべてスクリプトの開始時に処理され、保守が容易になります。

    define MY_ALIAS = &1
    define MY_MODEL = &2
    
    SELECT COUNT(*) as &MY_ALIAS
    FROM TABLE(SEM_MATCH(
    '{
            ?s rdf:type :ProcessSpec .
            ?s ?p ?o
    }',SEM_Models('&MY_MODEL'),NULL,
    SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL));
    

    別の質問から、たぶんあなたはただ欲しかったのかもしれません:

    SELECT COUNT(*) as &1
    FROM TABLE(SEM_MATCH(
    '{
            ?s rdf:type :ProcessSpec .
            ?s ?p ?o
    }',SEM_Models('&1'),NULL,
    SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL));
    

    ...したがって、エイリアスはクエリ対象の値と同じになります($2の値) 、またはBUILDING 答えの元の部分で)。置換変数は何度でも参照できます。

    複数回実行している場合は、出力の各ビットのカウント値の上にヘッダーとして表示されるため、使いにくい場合があります。たぶん、これは後でもっと解析可能になるでしょう:

    select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT
    

    set pages 0した場合 およびset heading off 、繰り返しの呼び出しがきちんとしたリストに表示される場合があります。 set tab offする必要がある場合もあります おそらくrpad('&1', 20)を使用します または同様に、その列を常に同じ幅にします。または、次のコマンドで結果をCSVとして取得します:

    select '&1' ||','|| COUNT(*)
    

    結果を何に使用しているかによって異なります...




    1. PL/pgSQL内でのINSERT後にデフォルトのシリアル値を取得する

    2. ClusterControl 1.5-自動バックアップ検証、バックアップとクラウド統合からスレーブを構築

    3. データベース内のすべてのテーブルのドロップテーブルステートメントを生成する方法-SQLServer/T-SQLチュートリアルパート48

    4. SQLデータ制御言語