Frage

Ich muss wissen, wie ich den Anweisungstyp eines vorbereiteten Anweisungshandles in OCI erhalten kann.

Das Dilemma ist wie folgt.Das vierte Argument von OCIStmtExecute() - iters - kann nicht sein 0 wenn die Aussage nicht a ist SELECT, aber es muss Sei 0 wenn die Aussage Ist A SELECT (und Definitionen können nicht im Voraus durchgeführt werden).Aus der OCI 10g-Dokumentation für OCIStmtExecute:

Bei nicht ausgewählten Aussagen ist die Häufigkeit, mit der diese Aussage ausgeführt wird, ITERS - Rowoff.

Für ausgewählte Aussagen müssen definiert, wenn ITERS ungleich Null ist, für den Anweisungsgriff durchgeführt worden sein.Die Ausführung holt die Zeilen in diese vordefinierten Puffer ab und schließt je nach Anzahl der Zeilenzeile mehr Zeilen vor.Wenn Sie nicht wissen, wie viele Zeilen die SELECT -Anweisung abgerufen werden, stellen Sie die ITERS auf Null fest.

Diese Funktion gibt einen Fehler zurück, wenn iters=0 für Nicht-SELECT-Anweisungen ist.

Für eine Aussage wie SELECT * ..., es ist unmöglich zu wissen, was die Spalten überhaupt sind Sind bevor Sie die erhalten describe Informationen aus dem Anweisungshandle, die erst danach verfügbar sind OCIStmtExecute() wird genannt.(Das ist also nicht möglich defines auf den Anweisungs-Handle im Voraus.) Daher muss ich bestehen 0 für iters wenn der (unbekannte) Anweisungstyp ist SELECT.Aber wenn der (unbekannte) Anweisungstyp ist nicht SELECT, OCI gibt einen Fehler zurück, wenn iters Ist 0 (genau wie es in der Dokumentation steht).

Der dokumentierte Weg, den Typ der Anweisung zu erhalten (SELECT oder nicht) erfolgt durch Abfrage eines Attributs des Anweisungshandles wie folgt:

ub2 statementType = 0;
OCIAttrGet(mystmt, OCI_HTYPE_STMT, (dvoid*)(&statementType), NULL, OCI_ATTR_SQLFNCODE, myerrhp);

Leider ist diese Funktion stets kehrt zurück 0 für statementType bis nach OCIStmtExecute() wird genannt.

Ich bin in einer Zwickmühle.Ich muss anrufen OCIAttrGet() bevor ich anrufe OCIStmtExecute() um den Typ der Anweisung zu erhalten, der festgelegt werden soll iters richtig.Allerdings muss ich anrufen OCIStmtExecute() Vor OCIAttrGet() wird gelingen.

Ich habe versucht anzurufen OCIStmtExecute() zweimal, das erste Mal vorbei OCI_DESCRIBE_ONLY für den letzten Parameter (mode).Bedauerlicherweise, OCIStmtExecute() Trotzdem gibt den Fehler im Zusammenhang mit an iters in diesem Fall.

(Bitte beachten Sie:das Anweisungshandle mystmt wurde mit einem Anruf rechtzeitig und erfolgreich vorbereitet OCIStmtPrepare2(), und das Fehlerhandle myerrhp wurde auch ordnungsgemäß zugeordnet.)

Was mache ich?

War es hilfreich?

Lösung

Benutzen Sie die OCI_ATTR_STMT_TYPE stattdessen:Es ist direkt danach verfügbar OCIStmtPrepare und kann verwendet werden, um die Art der Aussage grob zu bestimmen (d. h.auch wenn es sich um eine „select“-Anweisung handelt).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top