wake-up-neo.com

ORA-01036: Ungültiger Variablenname/-nummer beim Ausführen der Abfrage über C #

Ich versuche, ALTER USER query für die Oracle-Datenbank mit OracleCommand in C # im folgenden Code zu verwenden. Die Abfrage wird erstellt, wenn die Werte für Benutzername und Kennwort keine leeren Zeichenfolgen sind. Ich erhalte jedoch einen Fehler "ORA-01036: illegal variable name/number", wenn ExecuteNonQuery() ausgeführt wird.

  string updateQuery = "ALTER USER :user IDENTIFIED BY :password";
  connection = new OracleConnection(LoginPage.connectionString);
  connection.Open();                
  OracleCommand cmd = new OracleCommand(updateQuery, connection);
  cmd.Connection = connection;  
  for(int i=0;i<usersList.Count;i++)
        {
            if (!(selectedUsersArray[i].Equals("")) && !passwordArray[i].Equals(""))
            {
                OracleParameter userName = new OracleParameter();
                userName.ParameterName = "user";
                userName.Value = selectedUsersArray[i];

                OracleParameter passwd = new OracleParameter();
                passwd.ParameterName = "password";
                passwd.Value = passwordArray[i];

                cmd.Parameters.Add(userName);
                cmd.Parameters.Add(passwd);

                cmd.Prepare();
                cmd.ExecuteNonQuery();                   


            }
        }

Könnten Sie bitte vorschlagen, was an meiner Implementierung falsch ist?.

7
jetty

Die Hauptursache

In Oracle gibt es drei Arten von SQL-Anweisungen (und zusätzlich gibt es PL/SQL-Blöcke):

  • Anweisungen in der Data Definiton Language (DDL). Diese Anweisungen ändern die Struktur der Datenbank. Sie beginnen normalerweise mit den Verben "ALTER" oder "CREATE"
  • Anweisungen in der Data Modification Langugage (DML). Es gibt Anweisungen, die den Inhalt von Tabellen ändern und die Struktur jeder Tabelle unverändert lassen. Diese Anweisungen beginnen normalerweise mit "INSERT", "MERGE" oder "DELETE".
  • Anweisungen in dem, was ich "Abfragesprache" nenne (für diese scheint es keinen kanonischen Namen zu geben). Diese Anweisungen beginnen mit dem Verb "SELECT".

Bindungsvariablen in Oracle sind nur an bestimmten Stellen in DML- und Abfrageanweisungen zulässig. Sie versuchen, Bindungsvariablen an Stellen zu verwenden, an denen sie nicht zulässig sind. Daher der Fehler.

Lösung

Erstellen Sie Ihre Anweisung ohne Bindungsvariablen. Erstellen Sie stattdessen die vollständige Abfragezeichenfolge mithilfe der Verkettung von Zeichenfolgen.

Wenn Sie die Eingabe vor der Verkettung der Zeichenfolge bereinigen möchten, verwenden Sie das Paket DBMS_ASSERT .

Hintergrund

Bindungsvariablen können nur verwendet werden, wenn Oracle einen Abfrageplan erstellen kann, ohne den Wert der Variablen zu kennen. Für DDL-Anweisungen gibt es keinen Abfrageplan. Bindungsvariablen sind daher nicht zulässig.

In DML- und Abfrageanweisungen sind Bindevariablen nur zulässig, wenn sie in einem Tuple (hinsichtlich der zugrunde liegenden Mengenlehre) verwendet werden, dh wenn der Wert mit dem Wert in einer Tabelle verglichen wird oder wenn der Wert in eine Tabelle eingefügt wird . Sie dürfen die Struktur des Ausführungsplans nicht ändern (z. B. um die Zieltabelle oder die Anzahl der Vergleiche zu ändern).

17

Ich habe gerade einige Tage damit verbracht, Parameter zu überprüfen, da ich 60 an eine gespeicherte Prozedur übergeben muss. Es stellt sich heraus, dass einer der Variablennamen (den ich in eine Liste lade und an die von mir erstellte Oracle-Schreibmethode übergeben habe) am Ende ein Leerzeichen im Namen hatte. Beim Vergleich mit den Variablen in der gespeicherten Prozedur waren sie gleich, aber im Editor, den ich zum Vergleich verwendete, fiel mir der zusätzliche Platz nicht auf. Hat mich die letzten 4 Tage verrückt gemacht, alles versucht, was ich finden konnte, und sogar den .net Oracle-Treiber geändert. Ich wollte das nur rausschmeißen, damit es jemand anderem helfen kann. Wir neigen dazu, uns auf die Charaktere zu konzentrieren und die Leerzeichen zu ignorieren. . . 

7
SDanks

Sie haben einen oracleCommand definiert, ihn jedoch in "für" ..__ verwendet. Dies bedeutet, dass Sie einem OracleCommand . Parameter mit demselben Namen hinzufügen Sie sollten cmd.Parameters.clear() verwenden, um Ihre Parameter zu aktualisieren.

for(int i=0;i<usersList.Count;i++)
        {
            if (!(selectedUsersArray[i].Equals("")) && !passwordArray[i].Equals(""))
            {
                cmd.Parameters.clear();//Add this line
                OracleParameter userName = new OracleParameter();
                userName.ParameterName = "user";
                userName.Value = selectedUsersArray[i];

                OracleParameter passwd = new OracleParameter();
                passwd.ParameterName = "password";
                passwd.Value = passwordArray[i];

                cmd.Parameters.Add(userName);
                cmd.Parameters.Add(passwd);

                cmd.Prepare();
                cmd.ExecuteNonQuery();                   


            }
        } 
4
Sargol

Der Oracle-Fehler ORA-01036 bedeutet, dass die Abfrage irgendwo eine undefinierte Variable verwendet. Aus der Abfrage können wir ermitteln, welche Variablen verwendet werden: Alle, die mit @ beginnen. Wenn Sie dies jedoch in eine bevorzugte Abfrage eingeben, ist es wichtig zu bestätigen, dass alle Variablen einen übereinstimmenden Eingabeparameter haben, einschließlich des gleichen Falls im Variablennamen, wenn Ihre Oracle-Datenbank die Groß-/Kleinschreibung berücksichtigt.

2
Ravi Mavani
 cmd.Parameters.Add(new OracleParameter("GUSERID ", OracleType.VarChar)).Value = userId;

Ich hatte acht Parameter und einer hatte am Ende Platz, wie im obigen Code für "GUSERID" gezeigt.

0
Sribin

Ich hatte das gleiche Problem in einer Anwendung, die ich betreute. Neben all den Anpassungen zur Vorbereitung der Umgebung habe ich auch fast eine Stunde damit verbracht, mir mit diesem Fehler den Kopf zu zerbrechen "ORA-01036: illegal Variablenname/-nummer ", bis ich herausgefunden habe, dass die Anwendungsverbindung auf eine veraltete Datenbank verweist, sodass die Anwendung zwei weitere Parameter an die veraltete Datenbankprozedur übergeben hat, die den Fehler verursacht hat.

Sie können den Benutzer-/Tabellennamen nicht mit dem Parameter an pl/sql übergeben. Sie können eine Prozedur erstellen und SQL erstellen und sofort ausführen, um dies zu erreichen.

0
hkutluay

Nur für andere Benutzer, die diesen Fehler erhalten und nach Informationen darüber suchen, wird sie auch ausgelöst, wenn Sie einen Bindungsparameter übergeben und ihn niemals verwenden. Ich konnte das nirgendwo eindeutig finden, aber ich musste es durch Versuch und Irrtum beweisen. 

0
Beatscribe

Dieser Fehler tritt auf, wenn Sie auch cmd.CommandType = System.Data.CommandType.StoredProcedure; fehlen. 

0
mpora