Quelle est la bonne façon de traiter avec cet Oracle ORA-01403: pas de données disponibles Exception?
J'ai une table DB que je suis plus ou moins traiter comme une file d'attente. Je suis en train de chercher un seul élément de celui-ci. Cela fonctionne, sauf lorsque le SELECT..DANS échoue (ce qui peut arriver si il n'y a qu'un seul élément dans la file d'attente et de deux utilisateurs sur des machines distinctes essayer de le chercher, un seul va gagner).
Cela conduit à l'familier ORA-01403: pas de données disponibles exception. J'ai essayé de changer le PS de sorte qu'il serait de retour NULL dans ce cas le même type de résultat que vous obtiendrais une requête ne pouvais pas trouver tous les enregistrements, mais en vain. Je suis en train de faire quelque chose de mal ici.
PROCEDURE sp_GetNextEmailFromQueue (pAgentId IN NUMBER, pRecs OUT recordSet)
IS
EMAIL_ID INTEGER;
BEGIN
SELECT id INTO EMAIL_ID FROM
(SELECT id, is_replied_to, is_being_worked, date_received
FROM SSQ_EMAILS
WHERE is_replied_to = 0 AND is_being_worked =0
ORDER BY date_received ASC)
WHERE rownum = 1;
UPDATE SSQ_EMAILS x
SET x.is_being_worked = 1,
x.agent_id = pAgentId,
x.work_started_date = SYSDATE
WHERE x.id = EMAIL_ID;
OPEN pRecs FOR
SELECT x.id,
x.message_id,
x.to_email,
x.from_email,
x.subject,
x.message,
x.date_received,
x.href_link,
x.is_being_worked,
x.work_started_date,
x.is_replied_to
FROM SSQ_EMAILS x
WHERE x.id = EMAIL_ID;
EXCEPTION
WHEN no_data_found
THEN
OPEN pRecs FOR
SELECT NULL
FROM SSQ_EMAILS;
END;
OriginalL'auteur Chris Holmes | 2012-02-01
Vous devez vous connecter pour publier un commentaire.
J'avais mis le gestionnaire d'exception autour du morceau de code qui est réellement la cause de l'erreur d'être jeté. Si
email_id
est NULL, laUPDATE
ne mettra pas à jour les lignes et lesSELECT
ne reviendra pas toutes les lignes.Être conscient, cependant, que ce code n'empêche pas les deux appelants de travailler sur la même ligne. Si deux de session d'appel de cette procédure dans le même temps, il est tout à fait possible que les deux vont sélectionner la même ligne. Si vous voulez éviter cela, le
SELECT
aurait besoin de verrouiller la rangée sélectionnée avec leFOR UPDATE
clause.OriginalL'auteur Justin Cave
Vous ne pouvez rien faire dans ce cas:
Elle retourne la valeur null dans
pRecs
droit?MODIFIER
Deuxième approche:
Sergio, ce qui en fait n'est de me donner un ORA-24338: descripteur d'instruction n'est pas exécuté. Et je pense que cela a à voir avec la RefCursor (pRecs) non ouvert, à partir de ce que je peux obtenir de la documentation. Mon C# déclaration sur l'extérieur de cette, s'attend à un RefCursor.
Ok, alors, comment utiliser un curseur au lieu de "sélectionner"?
voir ma mise à jour, j'espère qu'elle vous aide.
OriginalL'auteur Sérgio Michels
select null from ssq_emails
aurez toujours une 1403 si il n'y a pas d'enregistrements dans la table. Je ne suis pas sûr que vous voulez faire quoi que ce soit dans le gestionnaire d'exception; vous ne savez pas comment votre appelant traiter avecpRecs
étant vide.OriginalL'auteur Alex Poole
Résolu en faisant ceci:
Il fonctionne parce que les RefCursor doit être ouvert. J'ai besoin d'un résultat vide, et cela semble être un moyen sûr de garantir que, parce que l'ID est le PK et ne peut pas être null.
OriginalL'auteur Chris Holmes
Comment à ce sujet, en évitant la manipulation d'exception:
OriginalL'auteur miazo