Informix: Wie übergeben, verwenden Sie und führen Sie mehrere Werte in einer einzelnen parameter einer gespeicherten Prozedur
Wie Kann ich das übergeben mehrerer Werte in einem einzelnen parameter einer gespeicherten Prozedur in Informix?.
Dies ist eine häufige Frage, aber ich habe gesehen noyhing über informix.
Fand ich eine post, aber es ist nicht für mich arbeiten, sollten die version der DB, oder bin ich etwas fehlt?
Ich versuche das ausführen einer WHERE X IN (SELECT Y FROM TABLE(PARAM))
Edit:
Dies ist ein Beispiel von, was ich versuche zu tun.
CREATE PROCEDURE test_hector
(
C LIST( SET (CHAR(10) NOT NULL ) NOT NULL)
)
RETURNING CHAR(10) AS C, CHAR(10) AS CVE, CHAR(50) AS DESC;
DEFINE vColumna like tclaves.columna;
DEFINE vClave like tclaves.clave;
DEFINE vdescve like tclaves.descve;
FOREACH
select columna, clave, descve
INTO vColumna, vClave,vdescve
from tclaves
where columna in (SELECT * FROM TABLE(C))
RETURN vColumna, vClave,vdescve WITH RESUME;
END FOREACH
END PROCEDURE;
Ich versuche, es auszuführen, aber ich glaube, ich bin mit Syntax-Probleme
EXECUTE PROCEDURE test_hector( '{stspols,stsrepo}');
Bin ich immer die Fehlermeldung [Informix][Informix ODBC Driver][Informix]Invalid collection literal value.
Ich ausgeführt diese Funktion execute function se_release()
erhalten Sie die informix-version dies ist, was ich habe.
column1
Spatial DataBlade Release 8.21.FC4R1 (Build 238) Compiled on Thu Aug 26 19:42:55 CDT 2010 with: IBM Informix Dynamic Server Version 10.00.FC7 glslib-4.00.UC10
Ich bin mit Aqua Data Studio 8.0.22
zu erstellen, und führen Sie die Prozedur. Runinng auf Windows 7 Ultimate 32-Bits
Vielen Dank im Voraus. Für jede Hilfe
InformationsquelleAutor Mr. | 2012-05-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definieren den Typ des Parameters als eine geeignete collection-Typ: LIST, SET, MULTISET (das ist, was ich sagte in der Antwort auf die übergreifende Frage).
Danke für die Verstärkung der Frage. Sie sagen:
Kann dies zu einem einfacheren problem zu beheben, als es auf der Oberfläche erscheint. Der input-Typ für das Verfahren soll sein, eine Sammlung, in der Tat, eine LISTE der EINGESTELLTEN Werte — wobei jeder Wert ist eine Zeichenfolge. Sie können schreiben, wie:
Erstellte ich mir eine dummy-Prozedur zu testen, diese syntax:
Sowie die Ausgabe von es war wie erwartet:
Beachten Sie, dass Informix unterstützt ein Kommentar Stil begonnen von
{
und endete mit der ersten folgenden}
. Allerdings, der Kommentar Stil ist unterdrückt, wenn das Schlüsselwort vor der{
ist ein SET, MULTISET oder LIST (und ja, das macht es wirklich schwer zu analysieren!). Sie können gewaltige (wenn auch pervertiert) viel Spaß mit "wo kannst du den{}
im SQL-oben" ohne seine Bedeutung zu verändern. Es ist eine Außenseiter-chance, dass eine API erkennen könnte, Informix{}
Kommentare aber nicht erkennen, die der Sammlung die Ausnahme. In diesem Fall würden Sie wahrscheinlich wieder einen syntax-Fehler (weil die zweite}
ist nicht zu erwarten, wenn Sie interpretieren das erste{
als start-Kommentar-symbol). In diesem Fall verwenden Sie eine der Notationen unten.Für die notation collection (SET, MULTISET, LIST) Literale im Laufe der Zeit entwickelt. Diese alternative notation funktioniert auch (und ist eng verwandt zu dem, was Sie versuchte ursprünglich, und ist das, was dokumentiert wurde ursprünglich):
Den Saiten innerhalb des Satzes müssen in Anführungszeichen eingeschlossen werden, aber das ganze literal ist selbst ein string, also brauchst du das doppelte der eingebetteten Zitate. Man könnte auch 'betrügen', und verwenden Sie doppelte Anführungszeichen und einfache Anführungszeichen:
Aus der Diskussion unten, und wie beschrieben in die alternative Antwort, das problem scheint nun zu sein, in Bezug auf die verschachtelte Sammlungen. Ein
LIST{SET{"str1", "str2"}}
ist eine geordnete Liste (mit einem Eintrag in es); dieser Eintrag ist selbst eine Reihe von (verschiedenen) strings, die keiner bestimmten Reihenfolge. Die Sie verwenden würden, ein MULTISET, wenn Sie benötigt werden, um in der Lage zu wiederholen Zeichenfolgen (aber die Reihenfolge ist nicht wichtig). Sie eine LISTE verwenden, ist die Reihenfolge wichtig ist (und Duplikate sind erlaubt in einer Liste).Klingt es so, als wenn Sie wirklich brauchen nur zu wählen, der argument-Typ, so dass es einfacher ist. Sie sollten in der Lage sein, mit einer Sammlung Typ effektiv ist, würde ich wohl nominieren GESETZT, so dass Sie nicht haben, um mit wiederholten Zeichenfolgen in der Liste, aber MULTISET oder LIST gelten auch Optionen. Mit einem Verfahren umbenannt in
test_3()
:War ich in der Lage, führen Sie beide der folgenden Aussagen, mit der die Ergebnisse dargestellt:
Dieser wurde mit einem ESQL/C-Schnittstelle. Sie sollten in der Lage sein, um die zweite für die Arbeit mit ODBC; das erste kann dazu führen, ein -201 syntax-Fehler.
Wenn Sie es vorziehen LISTE zu SETZEN, dann ändern SET der LISTE in der obigen code:
geschrieben, wie dieser Weg
EXECUTE PROCEDURE test_hector(LIST{SET{'stspols','stsrepo'}});
wirft[Informix][Informix ODBC Driver][Informix]A syntax error has occurred.
. Wriitten wie dieseEXECUTE PROCEDURE test_hector('LIST{SET{''stspols'',''stsrepo''}}');
wirft ` [Informix][Informix-ODBC-Treiber][Informix]noch Nicht implementiert. sqlerrm (=, ! =alle, alle=, oder !=alle für Sammlungen) ` und so 'EXECUTE PROZEDUR test_hector('LIST{SET{"stspols","stsrepo"}}');' wirft[Informix][Informix ODBC Driver][Informix]Not implemented yet. sqlerrm(=any, !=any, =all, or !=all for Collections)
🙁+1 btw für die ausführliche Erklärung. Fast arbeiten, ich denke, uns fehlt etwas
Ich vermute das der erste Fehler ist aufgrund der ODBC-Treiber mis-parsing der SQL-und versuchen, zu behandeln die
{
als Beginn Kommentar. Der zweite Fehler sieht wie die syntax durchgenommen haben, aber etwas ging schief bei der Verarbeitung führen. In dieser Phase, ich bin mir nicht sicher, ob das ein ODBC-problem oder ein server-problem. Ich vermute, ich müsste ein upgrade von meinem Surrogat für die gespeicherte Prozedur, so dass es versucht, auf Daten aus der Liste der sets, strings, und sehen, was passiert. Haben Sie versucht, mein super-einfaches Verfahren? Hat es Fehler auslösen?Deins funktioniert wie ein Charme!, vielleicht ist das problem in der
where columna in (SELECT * FROM TABLE(C))
, nochmals vielen Dank für Ihre wertvolle Hilfe!InformationsquelleAutor Jonathan Leffler
Ich versuchte es in einer anderen Weise und eine Lösung gefunden.
Modifizierte ich die Prozedur akzeptiert einen parameter nur als
List
, nicht einList{SET...
Suchen und ausführen wie auf diese Weise.
Oder diese Weise
Und es funktionierte wie ein Charme.
InformationsquelleAutor Mr.