comment passer des variables de script shell pour sqlplus
J'ai un script shell qui appelle le fichier.sql
Je suis à la recherche d'un moyen de passer certains paramètres de mon fichier.sql.
Si je ne passe pas une variable avec une valeur pour le script sql, je vais devoir créer plusieurs .sql fichiers avec l'instruction SELECT et tout cela allait changer quelques mots.
Mon script shell appels de fichier.sql:
sqlplus -S user/pass@localhost
echo " Processing triples"
./load_triples.sh BUILDING/Mapping_File BUILDING Y >> load_semantic.log
@/opt/D2RQ/file.sql
exit;
EOF
Et c'est ainsi que mon fichier.sql ressemble:
SET ECHO ON;
SPOOL count.log
SELECT COUNT(*) as total_count
FROM TABLE(SEM_MATCH(
'{
?s rdf:type :ProcessSpec .
?s ?p ?o
}',SEM_Models('BUILDING'),NULL,
SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL));
SPOOL OFF;
Puis-je modifier mon script shell afin qu'il passe les noms de variable?
I. e.: modèle = "BÂTIMENT"
et de les remettre à un fichier.sql?
Est-il quelque chose comme ça?
Votre script shell ressemble comme il a été mutilé un peu; est
Voir cette réponse: stackoverflow.com/questions/2236201/.... Vous pouvez ajouter les arguments pour le SQL en ligne de commande et la référence à l'aide de &1 type de notation.
load_triples.sh
le script et le sqlplus
appel juste avant la @/opt/...
ligne?Voir cette réponse: stackoverflow.com/questions/2236201/.... Vous pouvez ajouter les arguments pour le SQL en ligne de commande et la référence à l'aide de &1 type de notation.
OriginalL'auteur Angelina | 2013-07-10
Vous devez vous connecter pour publier un commentaire.
Vous semblez avoir un
heredoc
contenant un seul SQL*Plus de commande, mais il ne regarde pas à droite, comme indiqué dans les commentaires. Vous pouvez passer soit une valeur dans laheredoc
:ou si
BUILDING
est$2
dans votre script:Si votre
file.sql
avait unexit
à la fin, alors il serait encore plus simple que vous ne l'auriez pas besoin de l'heredoc
:Dans votre SQL, vous pouvez ensuite consulter les paramètres de position à l'aide de variables de substitution:
La
&1
sera remplacée par la première valeur passée au script SQL,BUILDING
; parce que c'est une chaîne, il doit encore être mis entre guillemets. Vous pourriezset verify off
de s'arrêter de vous montrer les substitutions dans la sortie.Vous pouvez passer plusieurs valeurs, et d'y faire référence de manière séquentielle, comme vous le feriez paramètres positionnels dans un script shell - le premier paramètre passé est
&1
, la deuxième est&2
, etc. Vous pouvez utiliser des variables de substitution n'importe où dans le script SQL, de sorte qu'ils peuvent être utilisés comme des alias de colonne avec pas de problème vous avez juste à être prudent ajout d'un paramètre supplémentaire que vous ajoutez à la fin de la liste (ce qui rend la numérotation de commande dans le script, peut-être) ou de régler tout de match:ou:
Si
total_count
est passé pour votre script shell puis il suffit d'utiliser son paramètre de position,$4
ou quoi que ce soit. Et votre SQL serait alors:Si vous passez beaucoup de valeurs vous pouvez trouver plus clair d'utiliser les paramètres positionnels de définir les paramètres nommés, de sorte que toute commande de questions sont traitées au début du script, où ils sont plus faciles à entretenir:
À partir de votre autre question, peut-être que tout ce qu'on voulait:
... donc l'alias sera la même valeur que vous interrogez sur (la valeur en
$2
, ouBUILDING
dans la partie initiale de la réponse). Vous pouvez faire référence à une variable de substitution autant de fois que vous le souhaitez.Qui pourrait ne pas être facile à utiliser si vous êtes en cours d'exécution à plusieurs reprises, comme il apparaîtra comme un en-tête au-dessus de la valeur de nombre dans chaque bit de sortie. Peut-être que ce serait plus analysée plus tard:
Si vous
set pages 0
etset heading off
, vos appels répétés peuvent apparaître dans une liste bien rangée. Vous pourriez aussi avoir besoin deset tab off
et éventuellement utiliserrpad('&1', 20)
ou similaire pour faire de cette colonne toujours la même largeur. Ou obtenir les résultats au format CSV avec:Dépend de ce que vous êtes en utilisant les résultats...
J'ai mis à jour la réponse avec un exemple à l'aide d'un alias nommé avec un positionnement variable de substitution. J'espère que c'est ce que vous vouliez dire.
DÉFINIR travaillé; définir MY_ALIAS = &1 définir MY_MODEL = &2 SELECT COUNT (*) &MY_ALIAS DE TABLE(SEM_MATCH( MERCI @Alex Poole
OriginalL'auteur Alex Poole