sql >> Database teknologi >  >> RDS >> Oracle

hvordan man overfører variabel fra shell-script til sqlplus

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




  1. Sådan tilpasser du dine MySQL- og MariaDB-sikkerhedskopier med ClusterControl

  2. Bestemmelse af, om feltdataene i Oracle er af nummertypen

  3. node.js async/await bruger med MySQL

  4. Vil du hente kolonnenavne og typer af en lagret procedure?