7

क्या परिणाम एक तैयार कथन से एक चर में सेट करना संभव है? मैं निम्नलिखित संग्रहीत प्रक्रिया बनाने की कोशिश कर रहा हूं लेकिन यह असफल रहा है:तैयार कथन से स्केलर परिणाम कैसे प्राप्त करें?

ERROR 1064 (42000) लाइन 31 पर: आपको अपने SQL वाक्यविन्यास में कोई त्रुटि है; 'stmt USING @m, @c, @a के पास उपयोग करने के लिए सही वाक्यविन्यास के लिए आपके MySQL सर्वर संस्करण से मेल खाने वाले मैन्युअल की जांच करें;

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 ; 

उत्तर

6

यह अजीब लग सकता है, लेकिन आप तैयार बयान स्ट्रिंग में सीधे चर निर्दिष्ट कर सकते हैं:

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

-- ... 

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

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

टेस्ट मामला:

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 ; 

परिणाम:

CALL myProc(400); 

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

आह उपयोग लगता है! बेशक!! –

+0

मुझे पता है कि यह उत्तर बहुत पुराना है लेकिन क्या कोई मुझे बता सकता है: जब मैं इस कोड का उपयोग करता हूं और मैं कॉल MyProc (600) का उपयोग करता हूं, तो यह एक खाली क्वेरी परिणाम नहीं देता है बल्कि इसके बजाय अंतिम 'वैध' कॉल देता है। वह क्यों है और मैं इसे कैसे बदल सकता हूं? इसे 'परिणाम' खाली के रूप में वापस करना चाहिए जब मैं इसे तालिका में एक मान नहीं देता हूं। – Meelah

1
नहीं

भी यकीन है कि क्यों आप अपने उदाहरण में गतिशील एसक्यूएल का उपयोग कर रहे हैं - यह बहुत आसान

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

इस कोड

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

EXECUTE stmt; 

if(@i='a') then 
............ 
end if; 
संबंधित मुद्दे