Ordre des paramètres de procédure stockée Oracle C #
Avec cette
PROCEDURE "ADD_BOOKMARK_GROUP" (
"NAME" IN VARCHAR2,
"BOOKMARK_GROUP_ID" IN NUMBER,
"STAFF_ID" IN VARCHAR2,
"MAX_NO" IN INT,
"NUMFOUND" OUT INT,
"NEW_ID" OUT NUMBER) IS
BEGIN
NEW_ID := -1;
SELECT COUNT(*) INTO NUMFOUND FROM BOOKMARK_GROUP_TABLE WHERE STAFF_ID = STAFF_ID;
IF NUMFOUND < MAX_NO THEN
INSERT INTO BOOKMARK_GROUP_TABLE (NAME, BOOKMARK_GROUP_ID, STAFF_ID) VALUES(NAME, BOOKMARK_GROUP_ID, STAFF_ID);
SELECT BGT_SEQUENCE.currval INTO NEW_ID FROM dual;
END IF;
END;
Je trouve intéressant que si je ne suis pas d'ajouter des paramètres dans l'ordre qu'ils ont été définis, par exemple
OracleCommand cmd = new OracleCommand("ADD_BOOKMARK_GROUP", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OracleParameter("NAME", name));
...
cmd.Parameters.Add(new OracleParameter("NEW_ID", OracleDbType.Decimal)).Direction = ParameterDirection.Output;
cmd.Parameters.Add(new OracleParameter("NUMFOUND", OracleDbType.Int32)).Direction = ParameterDirection.Output;
au lieu de
OracleCommand cmd = new OracleCommand("ADD_BOOKMARK_GROUP", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OracleParameter("NAME", name));
...
cmd.Parameters.Add(new OracleParameter("NUMFOUND", OracleDbType.Int32)).Direction = ParameterDirection.Output;
cmd.Parameters.Add(new OracleParameter("NEW_ID", OracleDbType.Decimal)).Direction = ParameterDirection.Output;
Les valeurs retournées par
cmd.Parameters["NEW_ID"].Value.ToString()
et
cmd.Parameters["NUMFOUND"].Value.ToString()
obtenir échangé, bien que l'exécution de la procédure par le biais de la VS2008 de l'Explorateur de Serveur renvoie les données correctes.
Pourquoi est-ce?
source d'informationauteur JC.
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas un Oracle buff, donc je ne peux pas vérifier mais il sons comme ils sont passés par la position (plutôt que de passé par nom). La morale equivelent:
au lieu de:
Ce n'est pas très rare depuis des années (dans le COM jours), une grande partie de mon code pour travailler avec un laissez-passer-par-position ADODB pilote.
Dans ce cas, le nom que vous donnez sert seulement comme une clé locale à la recherche de la valeur de la collection. Vous pouvez le vérifier facilement en inventant un nom:
Si le ci-dessus s'exécute sans erreur, c'est en passant par la position. Et ils sont passés par position... ensuite il suffit de les ajouter dans l'ordre ;-p Et ne pas ajouter de nouveaux paramètres, sauf à la fin...
Vous pouvez probablement BindByName paramètre sur l'objet OracleCommand. Cela fonctionne pour les droites des requêtes SQL avec des paramètres, je n'ai pas essayé avec des procédures stockées, mais il serait logique...
Pas une réponse à la question, mais vous pouvez utiliser l'option "insérer ... le retour ..." au lieu de sélectionner bgt_sequence.currval de double, par exemple:
Voir http://www.adp-gmbh.ch/ora/sql/insert_into_x_returning_y.html