5

file.sql を呼び出すシェル スクリプトがあります。

いくつかのパラメーターを file.sql に渡す方法を探しています。

ある値を持つ変数を sql スクリプトに渡さない場合、SELECT ステートメントを使用して複数の .sql ファイルを作成する必要があり、変更されるのはわずかな単語だけです。

私のシェル スクリプトは file.sql を呼び出します。

sqlplus -S user/pass@localhost
echo " Processing triples"
./load_triples.sh BUILDING/Mapping_File BUILDING Y >> load_semantic.log

@/opt/D2RQ/file.sql
exit;
EOF

そして、これは私のfile.sqlがどのように見えるかです:

SET ECHO ON;
SPOOL count.log

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

SPOOL OFF;

変数名を渡すようにシェル スクリプトを変更できますか?

すなわち: model = "BUILDING" で、これを file.sql に渡しますか?

そのようなものはありますか?

4

1 に答える 1

15

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

sqlplus -S user/pass@localhost << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF

またはスクリプトにBUILDINGある場合:$2

sqlplus -S user/pass@localhost << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF

file.sql最後にがあれば、exitは必要ないのでさらに簡単になりますheredoc:

sqlplus -S user/pass@localhost @/opt/D2RQ/file.sql $2

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

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

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


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

sqlplus -S user/pass@localhost << EOF
@/opt/D2RQ/file.sql total_count BUILDING
exit;
EOF

また:

sqlplus -S user/pass@localhost << 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(*)

結果を何に使うかにもよりますが…

于 2013-07-10T16:06:16.060 に答える