Oracle
 sql >> Datenbank >  >> RDS >> Oracle

wie man eine Variable vom Shell-Skript an sqlplus übergibt

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...