sql >> Database >  >> RDS >> Oracle

hoe variabele van shellscript door te geven aan sqlplus

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




  1. Hoe kan ik de laatste twee woorden in een zin in PostgreSQL matchen?

  2. Hoe de beheerserver in R12.2 toe te voegen?

  3. Enkele cursor doorspoelen

  4. Snelle gesplitste partitionering