2016-03-29 22 views
1

İki tabloyu güncelleştiren ve sonra üçüncü bir tabloya bir satır ekleyen bir saklı yordamım var. (Ve benim anlayış için, üçü tamamlanamazsa güncellemeleri geri gönderir veya ekler.) Her neyse, bu iki prosedürü başarıyla tamamlayıp bitirip son vermediğine bakılmaksızın, bu prosedürü her çalıştırdığımda, her zaman "başarılı" olacak ve yanlış döndür. Sunucu tarafında doğru hata kontrolünü yapabilmem için eğer iki güncellemeyi başarıyla tamamlarsa ve bir ekleme ve yanlışsa, bir değer (muhtemelen doğru) döndürmek için ona ihtiyacım var.Mysql saklı yordamının başarıyla yürütüldüğü nasıl söylenir

CREATE DEFINER=`db1`@`%` PROCEDURE `completed_procedure`(IN insubmissionid INT) 
BEGIN 

DECLARE ingregid INT; 
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; 
DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK; 

START TRANSACTION; 

SET @ingregid = (SELECT idgreg FROM submission WHERE idsubmission = insubmissionid); 

UPDATE submission SET status='a' WHERE idsubmission = insubmissionid; 

UPDATE greg SET iscomplete=1 WHERE idgreg = @ingregid; 

INSERT INTO completion (idperson, idgreg, datecompleted, idsubmission, mediaid, description, 
    privatestatus, contenttype, totalamount) 
SELECT s.idperson, s.idgreg, s.datesubmitted, s.idsubmission, 
    COALESCE(s.youtubeid, s.contentid) AS mediaidid, g.description, g.privatestatus, 
    g.contenttype, COALESCE(SUM(amount),0) AS totalamount 
FROM submission s 
INNER JOIN greg g on s.idgreg = g.idgreg 
INNER JOIN contribution c on s.idgreg = c.idgreg 
WHERE s.idsubmission = insubmissionid AND c.ispaid = 1; 

COMMIT; 
END 

bu konuda gitmek için en iyi yolu nedir: İşte

işlemdir?

+0

Herhangi bir değişiklik yapılıp yapılmadığını öğrenmek için bir veri değiştirme sorgusundan sonra 'SELECT ROW_COUNT()' kullanabilirsiniz. – Barmar

+0

@Barmar Tüm güncellemeler ve ekleme başarılı olursa, bunun başarısı = 1 için nasıl çalışacağına dair bir örnek gösterebilir misiniz? – Mitchell

+0

Bununla ne demek yanlış döndürür? Prosedürler hiçbir şey döndürmez, yalnızca işlevlerin dönüş değeri vardır. – Barmar

cevap

0

Bir değer döndürdünüz, bir örnek.

CREATE DEFINER=`db1`@`%` PROCEDURE `completed_procedure`(IN insubmissionid INT, OUT success INT 
BEGIN 

IF ( CONDITION ) THEN 
    SET success = 1; 
ELSE 
    SET success = -1; 
END IF; 
SELECT success ; 

COMMIT; 
END 
+1

Sanırım “SELECT success”, doğru. neden @ kullanmalı? – huhushow

+0

Emin değildim. Teşekkür ederim! –

+0

Bir OUT değişkenini parametre olarak bildirerek OUT parametresi için ek bir argüman göndermem gerekiyor. Bunu çağırırken belirtmem gereken bir değişkeni döndürmenin bir yolu var mı? – Mitchell

İlgili konular