Du ser ud til at have en heredoc
indeholdende en enkelt SQL*Plus-kommando, selvom den ikke ser rigtig ud som angivet i kommentarerne. Du kan enten sende en værdi i heredoc
:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF
eller hvis BUILDING
er $2
i dit script:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF
Hvis din file.sql
havde en exit
til sidst ville det være endnu nemmere, da du ikke behøver heredoc
:
sqlplus -S user/[email protected] @/opt/D2RQ/file.sql $2
I din SQL kan du derefter referere til positionsparametrene ved hjælp af substitutionsvariabler:
...
}',SEM_Models('&1'),NULL,
...
&1
vil blive erstattet med den første værdi, der sendes til SQL-scriptet, BUILDING
; fordi det er en streng, skal den stadig være omgivet af anførselstegn. Du ønsker måske at set verify off
for at stoppe, hvis du viser erstatningerne i outputtet.
Du kan sende flere værdier og henvise til dem sekventielt, ligesom du ville gøre positionelle parametre i et shell-script - den første parameter er &1
, den anden er &2
osv. Du kan bruge substitutionsvariabler hvor som helst i SQL-scriptet, så de kan bruges som kolonnealiaser uden problemer - du skal bare være forsigtig med at tilføje en ekstra parameter, som du enten tilføjer til slutningen af listen (hvilket gør nummereringen ude af rækkefølge i scriptet, potentielt) eller juster alt for at matche:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count BUILDING
exit;
EOF
eller:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count $2
exit;
EOF
Hvis total_count
bliver sendt til dit shell-script, så brug bare dets positionsparameter, $4
eller hvad som helst. Og din SQL ville så være:
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));
Hvis du sender mange værdier, vil du måske finde det klarere at bruge positionsparametrene til at definere navngivne parametre, så alle bestillingsproblemer behandles i starten af scriptet, hvor de er nemmere at vedligeholde:
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));
Ud fra dit separate spørgsmål ville du måske bare have:
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));
... så aliaset vil være den samme værdi, som du forespørger på (værdien i $2
, eller BUILDING
i den oprindelige del af svaret). Du kan henvise til en substitutionsvariabel så mange gange du vil.
Det er måske ikke nemt at bruge, hvis du kører det flere gange, da det vil vises som en header over tælleværdien i hver bit af output. Måske ville dette være mere parsable senere:
select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT
Hvis du set pages 0
og set heading off
, kan dine gentagne opkald vises på en pæn liste. Du skal muligvis også set tab off
og brug eventuelt rpad('&1', 20)
eller lignende for at få den kolonne til altid at være den samme bredde. Eller få resultaterne som CSV med:
select '&1' ||','|| COUNT(*)
Afhænger af, hvad du bruger resultaterne til...