Oracle-Parameter IN der Anweisung?
Bekam eine c#.net app, die ich ändern muss. Die Abfrage im moment effektiv bedeutet dies:
select * from contract where contractnum = :ContractNum
(sehr vereinfacht, nur um zu zeigen, verwenden wir ein = und ein parameter)
Diesen parameter Lesen in den Einstellungen.Einstellungen-Datei auf die C# - app und hat eine saite in ihm. Ich brauche zu ändern, um mehrere Verträge, so dass ich vermute, ich kann ändern Sie die SQL, um:
select * from contract where contractnum in (:ContractNum)
aber, dass keine Ergebnisse zurückgegeben, egal wie ich den format string in den parameter.
Gibt es eine Möglichkeit, die ich bekommen kann oracle eine mit einem parameter?
jede Hilfe dankbar, vielen Dank an alle.
- Wenn Sie odp.net oder Red Lizard als Daten-provider, die Sie verwenden könnten eine Oracle-Sammlung (eine verschachtelte Tabelle) als parameter. Dies ist der Schnellste Weg, aber es ist nicht möglich, wenn Sie system.Daten.oracleclient. Also, welche Art von dataprovider verwenden Sie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe noch zu finden, eine db unterstützt die Auswertung einer einzigen string-Variablen mit Kommata zu trennen, wie die Sohle
IN
- Klausel.Ihre Optionen sind Teilzeichenfolge der Variablen, so werden die durch Komma getrennten Variablen-Inhalte eingeschaltet sind, die in Zeilen, so kann man dann mitmachen auf. Oder verwenden Sie dynamische SQL ist eine SQL-Anweisung aufgebaut, wie ein string in einem sproc, bevor die Anweisung ausgeführt wird.
Können Sie eine Oracle-Sammlung von zahlen als parameter (bind variable), wenn Sie verwenden ODP.NET als dataprovider. Dies funktioniert mit dem Oracle server 9, 10 oder 11 und ODP.net release >= 11.1.0.6.20 .
Eine ähnliche Lösung möglich ist, wenn Sie Red Lizard ist .NET dataprovider für Oracle.
Wählen wir die Verträge mit contractnum 3 und 4.
Wir haben die Verwendung einer Oracle-Typ zum übertragen eines Arrays mit Vertrag zahlen unserer Abfrage.
MDSYS.SDO_ELEM_INFO_ARRAY
wird verwendet, weil, wenn wir diese bereits vordefinierte Oracle-Typ, den wir nicht haben, um zu definieren, unsere eigenen Oracle-Typ. Sie können füllenMDSYS.SDO_ELEM_INFO_ARRAY
mit max 1048576 zahlen.Den index auf Vertrag.contractnum nicht verwendet, wenn man es unterlässt hint /*+ Kardinalität(tab 10) */. Ich nahm an, contractnum ist der primäre Schlüssel, also diese Spalte indiziert werden.
Siehe auch hier: http://forums.oracle.com/forums/thread.jspa?messageID=3869879#3869879
könnte man eine Pipeline-Funktion zur Umwandlung eines string in eine Tabelle, die verwendet werden könnten, mit der
IN
Betreiber. Zum Beispiel (getestet mit 10gR2):mit dem folgenden Paket:
Deine Abfrage würde wie folgt Aussehen:
Für die Verwendung von parameter mit IN-Anweisung können Sie mithilfe dieser Konstruktion:
wo ContractNum ist das benutzerdefinierte array-Typ.
Ich weiß, das ist eine alte Frage, aber es ist eines von mehreren, in denen die gewählte Antwort hat mein problem nicht lösen und ich will auch nicht zum starten noch ein anderer thread zu diesem Thema, so werde ich nur nach unten setzen, was ich gefunden habe in meinen Reisen, in der Hoffnung, dass es vielleicht jemand helfen.
Ich nicht mit Oracle arbeiten viel, aber, wie in SQL Server, es scheint, dass übergeben eine Tabellenwert-parameter, den Sie brauchen, um einen entsprechenden UDT (user defined table), denen Sie die EXECUTE-Berechtigungen (ich könnte falsch sein). Dies bedeutet, dass andere Antworten darauf, die Verwendung eines integrierten SYS UDT kommen mit einigen Fracht-und ich konnte nicht herausfinden, ob es wirklich möglich ist, zu übergeben einen Tisch, um etwas, das nicht ist ein PL/SQL-Prozedur in der aktuellen version von ODP.net.
Zweite, die string-parsing-Lösung ist eine Behelfslösung für alle offensichtlichen Gründen (kann nicht zwischengespeichert werden, der Ausführungsplan Oracle oder was auch immer es nennt, nicht gut skalieren, etc).
So verbrachte ich ziemlich viel Zeit mit dem Versuch zu tun, die IN-Klausel mit einem Tabellenwert-parameter auf einem datamart auf die ich nur Leserechte, bevor ich getroffen wurde von einem blendenden Blitz der offensichtlichen (Bei einer ASP.net forum nicht weniger). Stellt sich heraus Oracle unterstützt Xml-Abfragen 'nativ', also statt der übergabe ein array von Werten übergeben Sie eine xml-Liste (wenn es das ist alles, was Sie brauchen). Wieder, ich könnte falsch sein, aber es wird behandelt, als eine legitime parameter binden und diese ist ein Beispiel dafür, wie einfach es zu verwenden ist (vb.net, ADO.net, ODP.net NuGet-Paket):
Dies ist eher eine Beobachtung als eine sorgfältig recherchierte Lösung, also bitte kommentieren, wenn es etwas unangemessen, es zu tun auf diese Weise.
BEARBEITEN. Es ist offenbar ein 4000 Zeichen begrenzt, mit dieser Methode (2000, wenn NVARCHAR), so musste ich aufpassen, meine paging. Die informative Fehlermeldung, die Sie erhalten, wenn Sie gehen über wird 'ORA-01460: implementierte oder unzumutbar Umwandlung beantragt'