Sie scheinen ein heredoc
zu haben enthält einen einzelnen SQL*Plus-Befehl, obwohl es nicht richtig aussieht, wie in den Kommentaren angegeben. Sie können entweder einen Wert im heredoc
übergeben :
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF
oder wenn BUILDING
ist $2
in Ihrem Skript:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF
Wenn Ihre file.sql
hatte einen exit
Am Ende wäre es dann noch einfacher, da Sie das heredoc
nicht benötigen würden :
sqlplus -S user/[email protected] @/opt/D2RQ/file.sql $2
In Ihrem SQL können Sie dann mit Substitutionsvariablen auf die Positionsparameter verweisen:
...
}',SEM_Models('&1'),NULL,
...
Der &1
wird durch den ersten Wert ersetzt, der an das SQL-Skript übergeben wird, BUILDING
; Da es sich um eine Zeichenfolge handelt, muss sie noch in Anführungszeichen gesetzt werden. Möglicherweise möchten Sie die set verify off
zu stoppen, wenn Ihnen die Ersetzungen in der Ausgabe angezeigt werden.
Sie können mehrere Werte übergeben und nacheinander auf sie verweisen, genau wie Sie es mit Positionsparametern in einem Shell-Skript tun würden - der erste übergebene Parameter ist &1
, der zweite ist &2
usw. Sie können überall im SQL-Skript Ersetzungsvariablen verwenden, sodass sie problemlos als Spaltenaliase verwendet werden können - Sie müssen nur darauf achten, einen zusätzlichen Parameter hinzuzufügen, den Sie entweder am Ende der Liste hinzufügen (was die Nummerierung im Skript möglicherweise nicht in der richtigen Reihenfolge) oder alles entsprechend anpassen:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count BUILDING
exit;
EOF
oder:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count $2
exit;
EOF
Wenn total_count
an Ihr Shell-Skript übergeben wird, dann verwenden Sie einfach seinen Positionsparameter $4
oder Wasauchimmer. Und Ihr SQL wäre dann:
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));
Wenn Sie viele Werte übergeben, finden Sie es möglicherweise klarer, die Positionsparameter zu verwenden, um benannte Parameter zu definieren, sodass alle Reihenfolgeprobleme am Anfang des Skripts behandelt werden, wo sie einfacher zu pflegen sind:
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));
Ausgehend von Ihrer separaten Frage wollten Sie vielleicht nur:
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));
... also ist der Alias derselbe Wert, den Sie abfragen (der Wert in $2
, oder BUILDING
im ursprünglichen Teil der Antwort). Sie können beliebig oft auf eine Substitutionsvariable verweisen.
Dies ist möglicherweise nicht einfach zu verwenden, wenn Sie es mehrmals ausführen, da es als Kopfzeile über dem Zählwert in jedem Ausgabebit angezeigt wird. Vielleicht wäre dies später besser zu analysieren:
select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT
Wenn Sie set pages 0
und set heading off
, werden Ihre wiederholten Anrufe möglicherweise in einer übersichtlichen Liste angezeigt. Möglicherweise müssen Sie auch set tab off
und eventuell rpad('&1', 20)
verwenden oder ähnliches, um diese Spalte immer gleich breit zu machen. Oder erhalten Sie die Ergebnisse als CSV mit:
select '&1' ||','|| COUNT(*)
Hängt davon ab, wofür Sie die Ergebnisse verwenden...