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(*)
結果を何に使用しているかによって異なります...