Définition et Utilisation de Variables dans .les scripts sql
Je suis en train de définir des variables dans un .fichier sql afin que je puisse les utiliser dans mes relevés sql. Mais je suis tellement confus au sujet de la façon dont ces variables sont définies, et je ne peux pas trouver une seule bonne ressource en ligne qui a expliqué tout cela de manière claire. J'ai suivi les recommandations de différentes sources et je reçois des erreurs de compilation dans "Oracle SQL Developer'. Voici mes 2 problèmes:
Problème 1: Il semble que vous pouvez définir des variables dans la suite de 2 façons. Quelle est la différence entre ces 2 façons, et puis-je utiliser les deux?
define first_name = Joe;
select * from customer where name = '&firstname';
ou
variable first_name CHAR;
exec :first_name:= 'Joe';
select * from customer where name = :firstname;
Problème 2: Dans la première méthode (le sens de la définir à l'aide de la commande), puis-je définir une variable de type nombre et si oui, comment puis-je le faire?
- Il semble que vous avez oublié de mettre fin à la première ligne dans le premier bloc de code avec un point-virgule. En outre, il peut aider si vous poster les erreurs de compilation que vous obtenez.
- Bref, la réponse au problème n ° 2: aucun. Voir aussi stackoverflow.com/a/7783530.
- J'ai élargi ma réponse à décrire la différence entre "1" et "problème 2". Luke est exact que la réponse à "le problème 2" est pas; j'espère que mon élargi réponse explique pourquoi.
- Merci Ed. Et Grâce À La Chance. J'ai juste regardé votre réponse à cette question; ce Qui aurait été exactement ce que je cherchais; la différence entre les lier et de remplacer les variables.
Vous devez vous connecter pour publier un commentaire.
- Réponse pour le problème 1:
Le premier type de variables appelées Variables de Substitution qui ne fonctionne que dans SQL*Plus et SQL Developer. Ainsi, lorsque vous fournissez un substituation vaiable dans une instruction SQL, SQL*Plus remplace la variable par sa valeur. Il n'a rien à voir avec le serveur Oracle ou de performance.
L'exemple que vous avez donné sera traduit à l'suivantes AVANT de l'envoyer au serveur de base de données Oracle:
La deuxième partie s'appelle lier les variables qui n'est pas exclusif à SQL*Plus ou SQL Developer que vous pouvez l'utiliser, par exemple, dans une application Java (ou d'autres langues) de la connexion à Oracle.
Lier les variables de fournir de meilleures performances lorsque vous exécutez la même déclaration, autant de fois que vous toujours soumettre la déclaration tel qu'il est, sans avoir à réécrire). Les variables évaluées au niveau base de données. Par exemple, disons que vous avez modifié la valeur de la "prenom" à "Marque":
La même déclaration auprès de la liaison variable est soumis à Oracle serveur de base de données. La base de données utilise le cache de la zone pour trouver que la même déclaration a été exécuté perviously et l'utilise de nouveau. Ensuite, la base de données utilise les valeurs de variables. Cela signifie que la base de données n'auront pas besoin de l'analyser à nouveau et re-calculer le meilleur plan d'exécution pour la même instruction.
Mais ce n'est pas le cas avec le premier type(Variables de Substitution).
- Réponse pour le problème 2:
Non, vous ne le pouvez pas, parce que comme je l'ai dit ci-dessus, tout ce que SQL*Plus ou SQL Developer faire est de simplement réécrire la déclaration de remplacer le nom de la variable avec la valeur. Il ne sait rien de ce genre. Seul le texte de remplacement est fait ici.
Vous pouvez trouver plus de détails ici:
http://www.oracle-base.com/articles/misc/literals-substitution-variables-and-bind-variables.php
Vous pouvez définir
NUMBER
variables, pas de problème:Beaucoup d'autres types sont pris en charge ainsi. Voici la
USAGE
texte d'aide de la VARIABLE de commande:Si vous tapez
VARIABLE
(ou justeVAR
) sans rien d'autre, SQL*Plus, la liste de toutes vos variables avec leurs valeurs.Additif: en contraste les deux affectation de variable styles dans la question d'origine.
Lorsque vous faites cela...
... C'est plus comme un
#define
en C/C++. Vous ne pouvez pas le traiter comme une variable, c'est juste le texte qui obtient collé à chaque fois que SQL*Plus voit&first_name
.Lorsque vous faites cela...
Vous êtes en train de créer une variable réelle que vous pouvez manipuler.
Notez que si vous utilisez
CHAR
dans la définition (sans taille), la première tâche sera de déterminer sa taille et vous ne pouvez pas en faire plus par la suite. Si vous le définir commeCHAR(50)
il va toujours être de 50 caractères et complétée par des espaces. Que pouvez obtenir confus, alors je vous recommandeVARCHAR2
dans la plupart des cas pour les chaînes.Dans Oracle, vous pouvez définir des variables comme suit:
Est-ce que vous cherchez?