Comment obtenir le type d'instruction OCI_ATTR_SQLFNCODE *before* OCIStatementExecute() ?

StackOverflow https://stackoverflow.com//questions/9641925

  •  10-12-2019
  •  | 
  •  

Question

J'ai besoin de savoir comment obtenir le type d'instruction d'un descripteur d'instruction préparé dans OCI.

Le dilemme est le suivant.Le quatrième argument de OCIStmtExecute() - iters - c'est pas possible 0 si la déclaration n'est pas un SELECT, mais c'est doit être 0 si la déclaration est un SELECT (et les définitions ne peuvent pas être faites à l'avance).À partir de la documentation OCI 10g pour OCIStmtExecute:

Pour les instructions non sélectionnées, le nombre de fois que cette instruction est exécutée est égal à iTERS - Rowoff.

Pour les instructions de sélection, si les iters sont non zéro, la définition doit avoir été effectuée pour la poignée de l'instruction.L'exécution récupère les lignes ITERS dans ces tampons prédéfinis et préfère plus de lignes en fonction du nombre de lignes de pré-feste.Si vous ne savez pas combien de lignes l'instruction SELECT récupérera, définissez les ites sur zéro.

Cette fonction renvoie une erreur si iters=0 pour les instructions non-SELECT.

Pour une déclaration telle que SELECT * ..., il est impossible de savoir même ce que contiennent les colonnes sont avant d'obtenir le describe informations provenant du descripteur d'instruction, qui n'est disponible qu'après OCIStmtExecute() est appelé.(Donc, ce n'est pas possible de faire defines sur la poignée de déclaration à l'avance.) Par conséquent, je dois passer 0 pour iters si le type d'instruction (inconnu) est SELECT.Mais si le type d'instruction (inconnu) est pas SELECT, OCI renvoie une erreur si iters est 0 (comme le dit la documentation).

La manière documentée d'obtenir le type de relevé (SELECT ou non) consiste à interroger un attribut du handle d'instruction, comme suit :

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

Malheureusement, cette fonction toujours Retour 0 pour statementType jusqu'à après OCIStmtExecute() est appelé.

Je suis dans une situation sans issue.je dois appeler OCIAttrGet() avant d'appeler OCIStmtExecute() pour obtenir le type d'instruction afin de définir iters correctement.Cependant, je dois appeler OCIStmtExecute() avant OCIAttrGet() allons réussir.

J'ai essayé d'appeler OCIStmtExecute() deux fois, la première fois en passant OCI_DESCRIBE_ONLY pour le paramètre final (mode).Malheureusement, OCIStmtExecute() toujours donne l'erreur liée à iters dans ce cas.

(Veuillez noter:le handle de l'instruction mystmt a été correctement préparé à l'avance, avec succès, avec un appel à OCIStmtPrepare2(), et le handle d'erreur myerrhp a également été correctement attribué.)

Que dois-je faire?

Était-ce utile?

La solution

Utilisez le OCI_ATTR_STMT_TYPE plutôt:Il est disponible juste après OCIStmtPrepare et peut être utilisé pour déterminer grossièrement le type de déclaration (c.-à-d.également s'il s'agit d'une instruction "select").

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top