Quels sont certains oracle gotchas pour quelqu'un de nouveau sur la plate-forme, mais pas neufs dans des bases de données relationnelles (MySQL, MS SQL Server, Postgres, etc.) en général. P>
Deux exemples du genre de choses que je recherche p>
De nombreuses produits de base de données relationnelles ont une poignée de la création d'une clé auto_incrimentation pour vous. Oracle ne peut pas, vous devez créer manuellement la séquence, puis créer la gâchette p> li>
Lorsque vous insérez des données via l'interface de développeur SQL, vous devez valider manuellement les données p> li> ol>
Points de bonus pour PHP Related Gotchas, car c'est la plate-forme Je s> ce nouveau-shirt hypothétique utilisera. p>
8 Réponses :
Oracle code> se comporte pas comme d'autres systèmes font. Oracle code> a de nombreux avantages par rapport aux autres SGBDR code> 's, mais ils ne sont pas le sujet du poste.
-
Vous ne pouvez pas SELECT code> sans FROM code>. P>
CREATE TABLE mytable
Vous devez expliquer cela. Afaik Select '' est nul de Dual, vous donnerait un faux.
@uswaretech: Non, il retournera une ligne. Essayez juste.
L'inverse de cette morve m'a sur SqlServer hier. Nous avons eu des scripts basés à Oracle qui inserrent '' et SqlServer ne tourne pas cela dans NULL ... m'a pris un certain temps pour y retourner.
Mais c'est ... ridicule. NULL n'est pas une chaîne vide, si nous sommes à cela, pourquoi ne pas traiter 0 comme null, hmm. Je suppose qu'il y a une bonne raison pour ça?
@uswaretech: Oracle est très très vieux. Lors de sa mise en place, il n'y avait pas de normes et ils ont décidé des chaînes vides et null code> est la même. ANSI SQL CODE> les exige à être différent, c'est pourquoi oracle code> utilise varchar2 code> au lieu de varchar code> et réservistes Varchar code> pour le faire ANSI code> compatible à l'avenir.
Je ne suis pas d'accord avec votre exemple pour "Les valeurs null ne sont pas indexées. Cette requête n'utilisera pas d'index:". D'une part, même si la colonne n'est pas nulle, elle n'utilisera toujours pas d'index - la table des numéros de table est plus rapide lors de la traversée de la table entière. Mais même si vous avez une colonne qui est "null", vous pouvez toujours l'indiquer et l'index sera utilisé - aussi longtemps que vous contraindrez sur une valeur qui n'est pas nulle. (suite)
Un meilleur exemple serait de dire que, si Col a un index sur lui et n'a pas été déclaré comme "non null", puis "Sélectionnez * à partir de MyTable où Col est NULL" n'utilisera pas d'index, mais "Sélectionnez * à partir de MyTable Où le col = 123 "va.
@Steve: Mon point était que cette question même que j'ai écrite n'utilisera pas l'index dans aucune condition (même si vous le souhaitez avec index code>). ROWNUM <10 CODE> Fait Index Le moins cher à utiliser que le balayage de la table complète (à moins que la table ne soit inférieure à une douzaine de valeurs longues).
Oracle a des serrures de niveau de table. "Sélectionnez ID de My_Table où 1 = 2 pour la mise à jour". D'une autre session, vous ne pouvez pas laisser tomber la table, mais vous pouvez supprimer + commetter toutes les lignes.
@JVA: Cela verrouille le dictionnaire, pas la table elle-même.
Que diriez-vous de "Table de verrouillage My_Table en mode exclusif" alors?
Aussi - télécharger.oracle.com/docs/ CD / B10501_01 / Server.920 / A96524 / ... mentionne à la fois les serrures de table et les serrures de rangée.
@JVA: Oui, mais c'est une serrure explicite. Je voulais dire que tous les verrous implicites sont au niveau de la ligne (par opposition à une escalade à la page / serrures de table dans SQL Server code>). Je devrais probablement le reformuler.
Quelle excellente réponse, bon travail. Vous voudrez peut-être mentionner l'index basé sur la fonction Windarounds pour la non-indexation des nulls (par exemple, index sur (my_nullable_column, 0)). Peut-être mentionner à l'aide de Varchar2 au lieu de Varchar2. Peut-être qu'il convient de mentionner l'utilisation des paramètres NLS pour la commande et la sortie de la date de contrôle.
Oh, vous pourriez mentionner que Oracle a une langue procédurale qui ne suce pas.
Et des tables temporaires globales et ne craignez pas d'utiliser le nombre minimum de requêtes complexes au lieu de briser les choses dans plusieurs requêtes. Statistiques aussi? Et des sociétés seulement à la fin d'une transaction logique, pas aussi tôt que possible (en raison du modèle de verrouillage).
@David: Vous avez raison, mais j'écris seulement de Gotchas ici, pas d'avantages.
@Quassnoi: C'est une geat écrit, elle mérite d'être un article ou un article de blog. @Steve Broberg: Les entrées de clé pour les nulls ne sont pas stockées dans les index Oracle, de sorte que les index uniques comportent différemment. Suivez le lien dans mon message et voir un exemple.
@Quassnoi & @Alex: L'utilisation de Rownum <10 ne provoquera pas de requête d'utiliser un index - au moins pas sur notre propre système (10.2.0.4.0) à l'aide d'une table avec 700 000 rangées et triez par le PK. J'ai constaté que l'utilisation de ROWNUM pour influencer le comportement de l'optimiseur est au mieux délicat; Il n'est pas toujours clair si la limitation de la rownum sera appliquée sur le résultat défini après la détermination du chemin d'accès ou auparavant.
@Alex, j'ai lu votre article et je le connais bien, mais comment cela change-t-il ce que j'ai dit? Si un indice est unique ou non n'affecte pas s'il sera utilisé dans une requête dans laquelle la contrainte de colonne utilise une valeur non nulle - l'index sera utilisé (en supposant que les statistiques soient à jour, etc.). La seule fois qu'il ne sera pas utilisé, c'est si votre contrainte est "la colonne est null". Encore une fois, c'est ce que je démontre sur notre système 10.2.0.4.0 ici, à l'aide d'une table d'essai avec une colonne de lignes 131075 (131072 entiers uniques et 3 lignes avec la valeur de NULL).
@Steve: C'était l'exemple de requête. Exemple. Comme dans "illustrer". Ce que je voulais dire que cette question même (cette question même) n'utilisera pas l'index, c'est tout :)
Sélectionner 1 ne fonctionne pas, sélectionnez 1 à la place à la place. p>
Si vous travaillez avec des données hiérarchiques, connectez-vous par est génial. p>
Il semble que j'ai rencontré plus de bases de données Oracle étant sensibles à la casse aux objets et aux données de schéma que dans SQL Server forts>. P>.
PostgreSQL code> et MySQL code> aussi. Il vaut mieux dire que SQL Server code> est moins sensible à la casse que les autres rdbms code> es :)
Où est sensible à l'oracle? J'ai fonctionné sous l'hypothèse que ce n'est pas aussi loin que les noms de table et les colonnes. Est-ce faux?
@ALAN: "MyTable" code> et "MyTable" code> (citations importantes) sont des objets différents. Sélectionnez * à partir de MyTable Code> (Sans guillemets) choisira de l'ancien, pas de ce dernier.
Je suis arrivé, merci quassnoi, je pense que vous venez de m'avoir sauvé plus d'une tête se gratter / frapper le moment à l'avenir.
La raison que la plupart des gens manquent cela est que Oracle écrasera tout en majuscule si vous ne l'entonnez pas dans des guillemets. Ainsi, tant que vous ne citez pas vos noms d'objet dB, vous ne verrez jamais le problème. Franchement, il n'y a pas beaucoup de raisons de le faire en premier lieu, à moins que vous n'êtes obsédé par des personnes qui voyent des noms de table et de colonne bien capitalisés lorsqu'ils utilisent des gis qui exposent vos objets de base de données, mais vous êtes coincé à mettre des citations doubles autour de Tout votre code source - une douleur énorme, imo.
N'oubliez pas d'utiliser NVL (colonne) autour de toute colonne d'une roulette pouvant être entièrement remplie avec des valeurs NULL. Sinon, la colonne sera manquante dans la rowset.
C'est vrai, tout en manque! P>
Exemple: P>
SELECT nvl(employeeName,'Archie'), nvl(employeeSpouse,'Edith') FROM Employee
@Chris: Pourriez-vous s'il vous plaît donner un exemple de ce que vous voulez dire?
@Chris: Just créé Table: Créer un employé de table (EmporteenAname Varchar2 (20), Employeepouse Varchar2 (20)) Code>, Rempli: Insérer dans les valeurs de l'employé (null, null) code> et vérifié: Sélectionnez * à partir de l'employé code>. Il m'a renvoyé une rangée avec deux null code>'s, comme cela devrait.
Désolé, il s'agit d'un problème avec les pilotes ODBC d'Oracle, pas la DB elle-même.
Il n'y a pas de concaténation de groupe comme dans MySQL. Si vous souhaitez une fonction d'agrégation d'une concaténation de groupe, vous devez écrire votre propre. Voici ma mise en œuvre:
select GROUP_CONCAT(GROUP_CONCAT_PARAM(tbl.someColumn, '|', 2)) from someTable tbl
Je crois qu'il est plus facile d'utiliser simplement la connexion hiérarchique par caractéristique à Oracle pour y accomplir. Consultez ma réponse Stackoverflow.com / Questions / 970481 / ...
Ou, dans oracle 10g + code>, une clause code> modèle code>. Voyez ici: Explicextenue.com/2009/04/05/GROUP_CONCAT- in-oracle-10g
J'ai écrit quelques différences ici: Think ANSI Standard SQL est entièrement portable entre les bases de données? Réfléchissez à nouveau. p>
Un commentaire: vous n'avez pas à créer un déclencheur afin d'utiliser des séquences, à moins que vous n'ayez pas admis sur la réplication du comportement de la colonne d'identité Sybase / SQL Server. Je trouve plus utile de simplement utiliser la séquence directement dans les instructions d'insertion réelles, par exemple
INSERT
INTO MyTable
( KeyCol
, Name
, Value
)
SELECT Seq_MyTable.NextVal
, 'some name'
, 123
FROM dual;
Vous les créez et indexez comme des tables normales, mais chaque session / transaction ne voit que ses propres données. Ceci est différent de MS SQL. P>
variables globales forte> p>
Ils sont passés par référence. Cela signifie que si vous passez une variable globale à une procédure en tant que paramètre et modifiez la variable globale à l'intérieur de votre procédure, la valeur de paramètre changera également. Pas une méthode très populaire, cependant. P>
jusqu'à ce que des versions très récentes, il n'y avait aucun moyen de déterminer une manière dans laquelle des déclencheurs similaires vont tirer. Si vous avez vraiment pris soin de quelles "avant la mise à jour de chaque ligne", vous avez tout d'abord mis tout dans un déclencheur. P>
Vous n'avez pas besoin d'un déclencheur pour mettre à jour une séquence - vous utilisez la séquence.Nextval
Une bonne information, et vaut probablement une réponse réelle (par opposition à un commentaire), mais cela entraîne moins de SQL portable, qui conduit certaines personnes (à droite ou incorrecte) d'utiliser des déclencheurs à la place.
De plus, le point n ° 2 est une préférence qui peut être activée dans le développeur SQL (outils-> Préférences-> Base de données -> Paramètres de la feuille de travail-> Autocommouver En feuille de calcul SQL).
Douce, merci pour la pointe Steve.