7

Hazırlanan bir ifadeden sonucu değişkene ayarlamak mümkün mü? Aşağıdaki saklı yordamını oluşturmaya çalışıyorum ama başarısız oluyor:Hazırlanan ifadeden skaler sonuç nasıl elde edilir?

HATA 1064 (42000) satır 31'de: SQL sözdiziminizde bir hata var; 'stmt USING @m, @c, @a yakınında kullanmak için doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuzu kontrol edin;

DROP PROCEDURE IF EXISTS deleteAction; 

DELIMITER $$ 
CREATE PROCEDURE deleteAction(
    IN modul CHAR(64), 
    IN controller CHAR(64), 
    IN actn CHAR(64)) 

MODIFIES SQL DATA 

BEGIN 

    PREPARE stmt FROM 'SELECT id 
         FROM actions 
         WHERE `module` = ? 
          AND `controller` = ? 
          AND `action` = ?'; 

    SET @m = modul; 
    SET @c = controller; 
    SET @a = actn; 

    SET @i = EXECUTE stmt USING @m, @c, @a; 

    DEALLOCATE PREPARE stmt; 

    DELETE FROM acl WHERE action_id = @i; 
    DELETE FROM actions WHERE id = @i; 

END 
$$ 
DELIMITER ; 

cevap

6

Bu garip gelebilir, ancak hazırlanan deyimi dizede doğrudan değişkeni atayabilirsiniz:

PREPARE stmt FROM 'SELECT @i := id FROM ...'; 

-- ... 

EXECUTE stmt USING @m, @c, @a; 

-- @i will hold the id returned from your query. 

Test durumda:

CREATE TABLE actions (id int, a int); 

INSERT INTO actions VALUES (1, 100); 
INSERT INTO actions VALUES (2, 200); 
INSERT INTO actions VALUES (3, 300); 
INSERT INTO actions VALUES (4, 400); 
INSERT INTO actions VALUES (5, 500); 

DELIMITER $$ 
CREATE PROCEDURE myProc(
    IN p int 
) 

MODIFIES SQL DATA 

BEGIN 

    PREPARE stmt FROM 'SELECT @i := id FROM actions WHERE `a` = ?'; 

    SET @a = p; 

    EXECUTE stmt USING @a; 

    SELECT @i AS result; 

    DEALLOCATE PREPARE stmt; 

END 
$$ 
DELIMITER ; 

Sonuç:

CALL myProc(400); 

+---------+ 
| result | 
+---------+ 
|  4 | 
+---------+ 
1 row in set (0.00 sec) 
+0

Ah çok daha kolay görünüyor! Tabii ki!! –

+0

Bu cevabın çok eski olduğunu biliyorum ama herkes bana söyleyebilir: Bu kodu kullandığımda ve CALL myProc (600) kullandığımda boş bir sorgu sonucunu döndürmez, bunun yerine son 'geçerli' çağrı olan her şeyi döndürür. Neden böyle ve bunu nasıl değiştirebilirim? Tabloda bulunmayan bir değeri geçtiğimde 'sonuç' boş olarak dönmelidir. – Meelah

1

değil sizin örnekte dinamik sql kullanıyorsanız neden bile emin - Bu

drop procedure if exists deleteAction; 

delimiter # 

create procedure deleteAction 
(
in p_modul char(64), 
in p_controller char(64), 
in p_actn char(64) 
) 
begin 

declare v_id int unsigned default 0; 

    select id into v_id from actions where 
      module = p_modul and controller = p_controller and action = p_actn; 

    delete from acl where action_id = v_id; 
    delete from actions where id = v_id; 

    select v_id as result; 

end # 

delimiter ; 

call deleteAction('mod','ctrl','actn'); 
2

kullanın bu kod

PREPARE stmt FROM 'SELECT ''a'' into @i' ; 

EXECUTE stmt; 

if(@i='a') then 
............ 
end if;