U lijkt een heredoc
. te hebben met een enkele SQL*Plus-opdracht, hoewel het er niet goed uitziet zoals vermeld in de opmerkingen. U kunt een waarde doorgeven in de heredoc
:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF
of als BUILDING
is $2
in je script:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF
Als uw file.sql
had een exit
aan het einde zou het nog eenvoudiger zijn omdat je de heredoc
. niet nodig hebt :
sqlplus -S user/[email protected] @/opt/D2RQ/file.sql $2
In uw SQL kunt u vervolgens verwijzen naar de positieparameters met behulp van substitutievariabelen:
...
}',SEM_Models('&1'),NULL,
...
De &1
wordt vervangen door de eerste waarde die aan het SQL-script is doorgegeven, BUILDING
; omdat dat een string is, moet hij nog steeds tussen aanhalingstekens staan. Misschien wilt u set verify off
om te stoppen als u de vervangingen in de uitvoer laat zien.
U kunt meerdere waarden doorgeven en er opeenvolgend naar verwijzen, net zoals u positionele parameters in een shellscript zou doen - de eerste doorgegeven parameter is &1
, de tweede is &2
, etc. U kunt substitutievariabelen overal in het SQL-script gebruiken, zodat ze probleemloos als kolomaliassen kunnen worden gebruikt - u moet alleen voorzichtig zijn met het toevoegen van een extra parameter die u ofwel aan het einde van de lijst toevoegt (waardoor de nummering niet in de juiste volgorde in het script, mogelijk) of pas alles aan om overeen te komen:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count BUILDING
exit;
EOF
of:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count $2
exit;
EOF
Als total_count
wordt doorgegeven aan uw shellscript, gebruik dan gewoon de positionele parameter, $4
of wat dan ook. En uw SQL zou dan zijn:
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));
Als u veel waarden doorgeeft, vindt u het wellicht duidelijker om de positionele parameters te gebruiken om benoemde parameters te definiëren, zodat eventuele ordeningsproblemen allemaal aan het begin van het script worden behandeld, waar ze gemakkelijker te onderhouden zijn:
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));
Van uw afzonderlijke vraag, misschien wilde u gewoon:
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));
... dus de alias heeft dezelfde waarde als waar u naar zoekt (de waarde in $2
, of BUILDING
in het oorspronkelijke deel van het antwoord). U kunt zo vaak naar een vervangingsvariabele verwijzen als u wilt.
Dat is misschien niet gemakkelijk te gebruiken als u het meerdere keren uitvoert, omdat het in elk uitvoerbit als een kop boven de telwaarde verschijnt. Misschien is dit later beter te parseren:
select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT
Als u set pages 0
en set heading off
, kunnen uw herhaalde oproepen in een overzichtelijke lijst verschijnen. Mogelijk moet u ook set tab off
en gebruik eventueel rpad('&1', 20)
of iets dergelijks om die kolom altijd even breed te maken. Of ontvang de resultaten als CSV met:
select '&1' ||','|| COUNT(*)
Hangt ervan af waarvoor je de resultaten gebruikt...