Oracle
 sql >> Base de données >  >> RDS >> Oracle

comment passer une variable du script shell à sqlplus

Vous semblez avoir un heredoc contenant une seule commande SQL*Plus, bien qu'elle ne semble pas correcte comme indiqué dans les commentaires. Vous pouvez soit passer une valeur dans le heredoc :

sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF

ou si BUILDING est de $2 dans votre script :

sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF

Si votre file.sql eu une exit à la fin, ce serait encore plus simple car vous n'auriez pas besoin du heredoc :

sqlplus -S user/[email protected] @/opt/D2RQ/file.sql $2

Dans votre SQL, vous pouvez ensuite faire référence aux paramètres de position à l'aide de variables de substitution :

...
}',SEM_Models('&1'),NULL,
...

Le &1 sera remplacé par la première valeur transmise au script SQL, BUILDING; car il s'agit d'une chaîne, elle doit toujours être placée entre guillemets. Vous voudrez peut-être set verify off pour s'arrêter si vous affichez les substitutions dans la sortie.

Vous pouvez passer plusieurs valeurs et vous y référer de manière séquentielle comme vous le feriez pour des paramètres de position dans un script shell - le premier paramètre passé est &1 , le second est &2 , etc. Vous pouvez utiliser des variables de substitution n'importe où dans le script SQL, de sorte qu'elles peuvent être utilisées comme alias de colonne sans problème - vous devez juste faire attention en ajoutant un paramètre supplémentaire soit vous l'ajoutez à la fin de la liste (ce qui rend la numérotation dans le désordre dans le script, éventuellement) ou ajustez tout pour qu'il corresponde :

sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count BUILDING
exit;
EOF

ou :

sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count $2
exit;
EOF

Si total_count est transmis à votre script shell, utilisez simplement son paramètre de position, $4 ou peu importe. Et votre SQL serait alors :

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));

Si vous transmettez un grand nombre de valeurs, vous trouverez peut-être plus clair d'utiliser les paramètres de position pour définir des paramètres nommés, de sorte que tous les problèmes d'ordre sont tous traités au début du script, où ils sont plus faciles à gérer :

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));

D'après votre question distincte, vous vouliez peut-être simplement :

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));

... donc l'alias sera la même valeur que celle sur laquelle vous interrogez (la valeur dans $2 , ou BUILDING dans la partie originale de la réponse). Vous pouvez faire référence à une variable de substitution autant de fois que vous le souhaitez.

Cela peut ne pas être facile à utiliser si vous l'exécutez plusieurs fois, car il apparaîtra comme un en-tête au-dessus de la valeur de comptage dans chaque bit de sortie. Peut-être que ce serait plus analysable plus tard :

select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT

Si vous set pages 0 et set heading off , vos appels répétés peuvent apparaître dans une liste claire. Vous devrez peut-être également set tab off et éventuellement utiliser rpad('&1', 20) ou similaire pour que cette colonne ait toujours la même largeur. Ou obtenez les résultats au format CSV avec :

select '&1' ||','|| COUNT(*)

Cela dépend de l'utilisation que vous faites des résultats...