2013-10-17 17 views
1

我正在为mysql认证学习,并且我学习的方式是通过做,我之前通过一个问题失败了,如果我有更多的关注存储过程我会得到它。任何我正在编造一些时髦的场景,我实际上会使用,所以这里是我难以理解的场景。当我调用2 OUT参数时,MySQL存储过程返回NULL值 - 请参阅代码

/*TABLE STRUCTURE */ 
    CREATE TABLE `members` (
     `id` mediumint(8) unsigned NOT NULL auto_increment, 
     `name` varchar(255) default NULL, 
     `email` varchar(255) default NULL, 
     PRIMARY KEY (`id`) 
    ); 


    /* PROCEDURE STRUCTURE */ 
    USE WOL_STATISTICS; 

    DELIMITER $$ 

    CREATE PROCEDURE `select_user` 
    (
    IN `idnum` INT(11), 
    OUT `name` VARCHAR(255), 
    OUT `email` VARCHAR(255) 
    ) 

    SQL SECURITY DEFINER 
    LANGUAGE SQL 
    NOT DETERMINISTIC 


    BEGIN 
    SELECT `name`, `email` FROM `members` WHERE `id` = `idnum`; 
    END $$ 

    DELIMITER ; 


    /* CALL STATEMENT */ 

    CALL select_user(20, @name, @email); 
     SELECT @name, @email; 

我总是找回空值谁能告诉我为什么?

回答

1

首先,你确定你的表格定义是正确的吗?您似乎必须在表中名为id的列。

二:你选择从表中nameemail列,但你不out参数nameemail(也许你应该重新命名的参数别的东西来避免这种mixups,像分配值outnameoutemail)。这不是自动完成的。告诉SELECT声明明确指定选择哪些列并将结果分配给变量有很大的区别。

因此,虽然存储过程实际上返回结果集,但两个输出参数将始终为null,除非您为其分配值。

+0

嗨,对不起,我实际上删除了第二个ID时,我创建了我测试的表,这是一个错误。我仍然迷失。我已经将out参数重命名为OUT'outname' VARCHAR(255), OUT'outemail' VARCHAR(255),我试图使用以下调用select_user(20,'@outname','@outemail' ); SELECT'@outname','@outemail';但仍然null null – user2610856

+0

像Thorsten说,分配值给你的变量。做'SELECT name,email INTO outname,outemail FROM ...'(如果我记得语法正确)。 – fancyPants

0

改变你的: 选择nameemail FROM members WHERE id = idnum; 至 选择name,email INTO PARAMETER_NAME,PARAMETER_EMAIL从members WHERE id = idnum;

尝试使用其他放慢参数名称等P_NAME,P_EMAIL E设置这样的:

name SELECT,email INTO P_NAME,P_EMAIL FROM members WHERE id = P_IDNUM;