sql >> Databasteknik >  >> RDS >> Oracle

hur man skickar variabel från skalskript till sqlplus

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




  1. Hur skapar jag en sekvens i MySQL?

  2. Hur man får aktuellt datum och tid i MySQL

  3. Hur BIT_LENGTH() fungerar i MariaDB

  4. Kan jag skjuta upp referensintegritetskontroller i MySQL tills commit