Du verkar ha en heredoc
som innehåller ett enda SQL*Plus-kommando, även om det inte ser rätt ut som noterat i kommentarerna. Du kan antingen skicka ett värde i heredoc
:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF
eller om BUILDING
är $2
i ditt manus:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF
Om din file.sql
hade en exit
i slutet skulle det vara ännu enklare eftersom du inte skulle behöva heredoc
:
sqlplus -S user/[email protected] @/opt/D2RQ/file.sql $2
I din SQL kan du sedan referera till positionsparametrarna med hjälp av substitutionsvariabler:
...
}',SEM_Models('&1'),NULL,
...
&1
kommer att ersättas med det första värdet som skickas till SQL-skriptet, BUILDING
; eftersom det är en sträng måste den fortfarande omges av citattecken. Du kanske vill set verify off
för att stoppa om du visar ersättningarna i utgången.
Du kan skicka flera värden och hänvisa till dem sekventiellt precis som du skulle göra positionsparametrar i ett skalskript - den först skickade parametern är &1
, den andra är &2
, etc. Du kan använda substitutionsvariabler var som helst i SQL-skriptet, så de kan användas som kolumnalias utan problem - du måste bara vara försiktig med att lägga till en extra parameter som du antingen lägger till den i slutet av listan (vilket gör numreringen ur ordning i skriptet, eventuellt) eller justera allt för att matcha:
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
Om total_count
skickas till ditt skalskript, använd bara dess positionsparameter, $4
eller vad som helst. Och din SQL skulle då vara:
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));
Om du skickar många värden kan du tycka att det är tydligare att använda positionsparametrarna för att definiera namngivna parametrar, så alla beställningsproblem hanteras i början av skriptet, där de är lättare att underhålla:
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));
Från din separata fråga kanske du bara ville ha:
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 kommer att vara samma värde som du frågar efter (värdet i $2
, eller BUILDING
i den ursprungliga delen av svaret). Du kan referera till en substitutionsvariabel så många gånger du vill.
Det kanske inte är lätt att använda om du kör det flera gånger, eftersom det kommer att visas som en rubrik ovanför räknevärdet i varje utdatabit. Kanske skulle detta vara mer tolkbart senare:
select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT
Om du set pages 0
och set heading off
, kan dina upprepade samtal visas i en snygg lista. Du kan också behöva set tab off
och använd eventuellt rpad('&1', 20)
eller liknande för att den kolumnen alltid ska ha samma bredd. Eller få resultaten som CSV med:
select '&1' ||','|| COUNT(*)
Beror på vad du använder resultaten för...