2014-01-08 97 views
0

这是我的存储过程:SQL存储过程中,变量为空

CREATE PROCEDURE `insert_exercise` (nazev VARCHAR(45), URL VARCHAR(255), obtiznost INT, partie INT) 

BEGIN 
    DECLARE video_id INT; 
    DECLARE cvik_id INT; 

    INSERT INTO `odkaz_video` (URL) VALUES (@URL); 
    SELECT id INTO video_id FROM `odkaz_video` WHERE URL = @URL; 
    INSERT INTO `cvik` (nazev, odkaz_video, obtiznost_id) VALUES (@nazev, video_id, @obtiznost); 
    SELECT id INTO cvik_id FROM `cvik` WHERE nazev = @nazev; 
    INSERT INTO `cvik_partie` (partie_id, cvik_id) VALUES (@partie, cvik_id); 
END 

当我把这叫做SP,我得到错误1048列“网址”不能为空。即使我输入了所有参数,为什么这个变量(@URL)为空?

感谢您的回应

+0

您也可能会发现这个答案有帮助:http://stackoverflow.com/questions/1009954/mysql-variable-vs-variable-whats-the-difference – zedfoxus

+0

能否请您包括您用来调用存储过程的确切语句以及所涉及表的完整表定义?这可能是问题出现在调用语句或表定义中的关键约束的结果中。 – Gerf

回答

1

用作过程参数给出的名字:

CREATE PROCEDURE insert_exercisenazev VARCHAR(45),URL VARCHAR(255),obtiznost INT ,partie INT)

它们的前缀不是@

看看这个教程:MySQL stored procedure parameters

0

@URL为NULL,因为你永远不将其值设置。输入参数名为URL,而不是@URL

此外,我建议您在参数名称前加上p_和局部变量名称v_以区分它们与列名称。

例如:

CREATE PROCEDURE `insert_exercise` (p_nazev VARCHAR(45), p_URL VARCHAR(255), p_obtiznost INT, p_partie INT) 

BEGIN 
    DECLARE v_video_id INT; 
    DECLARE v_cvik_id INT; 

    INSERT INTO `odkaz_video` (URL) VALUES (p_URL); 
    SELECT id INTO v_video_id FROM `odkaz_video` WHERE URL = p_URL; 
    INSERT INTO `cvik` (nazev, odkaz_video, obtiznost_id) VALUES (p_nazev, v_video_id, p_obtiznost); 
    SELECT id INTO v_cvik_id FROM `cvik` WHERE nazev = p_nazev; 
    INSERT INTO `cvik_partie` (partie_id, cvik_id) VALUES (p_partie, v_cvik_id); 
END