sql >> Databáze >  >> RDS >> Oracle

ORA-01036:neplatný název/číslo proměnné při spuštění dotazu přes C#

Hlavní příčina

V Oracle máte tři druhy SQL příkazů (a navíc existují PL/SQL bloky):

  • Prohlášení v jazyce Data Definiton Language (DDL). Tyto příkazy upravují strukturu databáze. Začínají obvykle slovesy „ALTER“ nebo „CREATE“
  • Výkazy v jazyce DML (Data Modification Langugage). Příkazy upravují obsah uvnitř tabulek, přičemž struktura každé tabulky zůstává nezměněná. Tyto příkazy obvykle začínají "INSERT", "MERGE" nebo "DELETE".
  • Příkazy v tom, čemu říkám „dotazovací jazyk“ (zdá se, že pro ně neexistuje žádný kanonický název). Tento příkaz začíná slovesem "SELECT".

Bind proměnné v Oracle jsou povoleny pouze na některých speciálních místech v DML a příkazech dotazů. Pokoušíte se použít proměnné vazby na místech, kde nejsou povoleny. Proto ta chyba.

Řešení

Sestavte svůj příkaz bez vazebných proměnných. Místo toho vytvořte úplný řetězec dotazu pomocí zřetězení řetězců.

Pokud chcete před zřetězením řetězce vyčistit vstup, použijte balíček DBMS_ASSERT.

Pozadí

Svázat proměnné lze použít pouze v případě, že Oracle dokáže vytvořit plán dotazů bez znalosti hodnoty proměnné. Pro příkazy DDL neexistuje žádný plán dotazů. Proměnné vazby proto nejsou povoleny.

V příkazech DML a dotazu jsou proměnné vazby povoleny pouze tehdy, když jsou použity uvnitř n-tice (s ohledem na základní teorii množin), tj. když bude hodnota porovnána s hodnotou v tabulce nebo když bude hodnota vložena do tabulky. . Nesmí měnit strukturu prováděcího plánu (např. měnit cílovou tabulku nebo měnit počet porovnávání).



  1. Převést „smalldatetime“ na „datetime“ v SQL Server (příklady T-SQL)

  2. Zastaralé funkce, které je třeba vyjmout ze sady nástrojů – část 1

  3. Úpravy dat pod položkou Read Committed Snapshot Isolation

  4. Jak nainstalovat nejnovější MySQL 8 na Debian 10