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).