Que font exactement les guillemets autour du nom de table?

Je pensais que le guillemet (“) était simplement un type de marqueur de regroupement, mais je débogue du code NHibernate et remarque

SELECT * FROM site WHERE site_id = 3; 

Fonctionne bien

 SELECT * FROM "site" WHERE site_id = 3; 

échoue avec une table ou la vue n’existe pas d’erreur.

Ce qui donne?

Placer des guillemets doubles autour d’un identifiant dans Oracle oblige Oracle à traiter l’identifiant comme sensible à la casse plutôt que d’utiliser l’insensibilité à la casse par défaut. Si vous créez une table (ou une colonne) avec des guillemets doubles autour du nom, vous devez toujours vous référer à l’identifiant avec des guillemets et en spécifiant correctement la casse (à l’exception de tous les identificateurs majuscules ).

Sous les couvertures, Oracle effectue toujours une correspondance d’identifiant sensible à la casse. Mais il lance toujours des identifiants qui ne sont pas entre guillemets en majuscules avant de faire la correspondance. Si vous placez des guillemets doubles autour d’un identifiant, Oracle ignore la conversion en majuscules.

Donc, si vous faites quelque chose comme

 CREATE TABLE my_table( col1 number, col2 number ) 

vous pouvez

 SELECT * FROM my_table SELECT * FROM MY_TABLE SELECT * FROM My_Table SELECT * FROM "MY_TABLE" 

mais quelque chose comme

 SELECT * FROM "my_table" 

va échouer.

Par contre, si vous faites quelque chose comme

 CREATE TABLE "my_other_table"( col1 number, col2 number ) 

tu ne peux pas faire

 SELECT * FROM my_other_table SELECT * FROM MY_OTHER_TABLE SELECT * FROM My_Other_Table SELECT * FROM "MY_OTHER_TABLE" 

mais ça

 SELECT * FROM "my_other_table" 

marchera

Il convient d’append que les identifiants entre guillemets peuvent contenir des caractères spéciaux, par exemple “ab cd” est un identifiant valide.