sql >> Database >  >> RDS >> Oracle

ORA-01036:ongeldige variabele naam/nummer bij het uitvoeren van een query via C#

De hoofdoorzaak

In Oracle heb je drie soorten SQL-statements (en daarnaast zijn er PL/SQL-blokken):

  • Statements in de Data Definiton Language (DDL). Deze instructies wijzigen de structuur van de database. Ze beginnen meestal met de werkwoorden "ALTER" of "CREATE"
  • Uitspraken in de gegevensmodificatietaal (DML). Hun instructies wijzigen de inhoud van tabellen, waarbij de structuur van elke tabel ongewijzigd blijft. Deze instructies beginnen meestal met "INSERT", "MERGE" of "DELETE".
  • Uitspraken in wat ik "zoektaal" noem (er lijkt geen canonieke naam voor te bestaan). Deze uitspraken beginnen met het werkwoord "SELECT".

Bindvariabelen in Oracle zijn alleen toegestaan ​​op bepaalde speciale plaatsen in DML- en query-instructies. U probeert bindvariabelen te gebruiken op plaatsen waar ze niet zijn toegestaan. Vandaar de fout.

Oplossing

Bouw uw verklaring zonder bindvariabelen. Bouw in plaats daarvan de volledige queryreeks met behulp van tekenreeksaaneenschakeling.

Als u de invoer wilt opschonen voordat u de tekenreeks samenvoegt, gebruikt u het pakket DBMS_ASSERT.

Achtergrond

Bindvariabelen kunnen alleen worden gebruikt wanneer Oracle een queryplan kan bouwen zonder de waarde van de variabele te kennen. Voor DDL-instructies is er geen queryplan. Daarom zijn bindvariabelen niet toegestaan.

In DML- en query-instructies zijn bindvariabelen alleen toegestaan ​​wanneer ze binnen een tuple worden gebruikt (met betrekking tot de onderliggende verzamelingenleer), d.w.z. wanneer de waarde wordt vergeleken met de waarde in een tabel of wanneer de waarde in een tabel wordt ingevoegd . Ze mogen de structuur van het uitvoeringsplan niet wijzigen (bijvoorbeeld om de doeltabel te wijzigen of het aantal vergelijkingen te wijzigen).



  1. DISTINCT tellen over meerdere kolommen

  2. MySql Count kan geen 0 waarden weergeven

  3. “PostgreSQL 9.0 High Performance” boek is uit

  4. SQL Server-netwerkinterfaces:verbindingsreeks is niet geldig [87]