sql >> Database >  >> RDS >> Oracle

Oracle SELECT - Dubbele aanhalingstekens of geen dubbele aanhalingstekens?

De antwoorden en links over hoofdletters zijn correct, maar uw situatie gaat iets verder dan een eenvoudige zaak, zowel omdat uw kolomnaam begon met een onderstrepingsteken als omdat uw klant het citaat blijkbaar meestal voor u verbergt.

Als u probeerde een tabel te maken met een kolom met de naam _id , zonder het te citeren, krijgt u de foutmelding 'ORA-00911:ongeldig teken', waarvan de oorzaaktekst zegt:'identifiers mogen niet beginnen met een ander ASCII-teken dan letters en cijfers'; wat eigenlijk ook verkeerd is omdat het ook niet met een cijfer kan beginnen (bijvoorbeeld 0_id geeft 'ORA-00904::ongeldige identifier'). Dit wordt ondersteund door de naamgevingsregels voor databaseobjecten :

Het lijkt er dus op dat Aqua Data Studio een conventie volgt om de hoofdletterversie van de objectnaam die u opgeeft tussen dubbele aanhalingstekens te plaatsen, een praktijk die wordt genoemd in een van de gekoppelde berichten.

Van wat je hebt laten zien, select _id from ... wordt doorgegeven aan Oracle als select "_ID" from ... , wat prima is als de kolomnaam is gemaakt als "_ID" . Het lijkt erop dat dit het geval is voor table1 , maar table2 is gemaakt als "_id" - zodat de niet-overeenkomende hoofdletters de legitieme ORA-00904 genereren die u ziet.

Uw klant wijzigt geen kolomnaam die al tussen dubbele aanhalingstekens staat, dus select "_id" from ... wordt doorgegeven aan Oracle zoals het is, en werkt goed voor table2 (maar, omgekeerd, zou mislukken voor table1 ).

Oracle vereist dat de naam tussen dubbele aanhalingstekens wordt geplaatst als deze niet voldoet aan de regels voor niet-geciteerde identifiers, en als deze is gemaakt als aanhalingstekens - tenzij de oorspronkelijke waarde tussen aanhalingstekens toch geldig was, d.w.z. de niet-geciteerde regels volgt en in hoofdletters is ingevoerd. Aangezien uw kolomnaam begint met een onderstrepingsteken, moeten wat Oracle betreft alle verwijzingen ernaar tussen dubbele aanhalingstekens staan, ongeacht het geval. Je klant doet dat gewoon op de achtergrond als je het zelf niet hebt geciteerd.

Door het advies van anderen op te volgen om identifiers tussen aanhalingstekens te vermijden en om altijd namen te gebruiken die geldig zijn zonder aanhalingstekens, zouden dergelijke problemen worden voorkomen.



  1. Lightswitch staat het toevoegen of wijzigen van records in MySQL niet toe

  2. JDBC ResultSet krijg kolommen met tabelalias

  3. Handeling-latentie in MySQL-transacties

  4. Geïndexeerde weergave van onderhoud in uitvoeringsplannen