存储过程和查询执行之间的不同结果
Different result between stored procedure and query execution
我正在尝试使用 Navicat 使用 mysql 执行一个存储过程,当我执行这个存储过程时,我得到了 0 行,但是当我执行我想要的存储过程部分时,我得到了 1 行这就是我想要的。存储过程是这样的:
BEGIN
#Routine body goes here...
IF @autor=0 THEN
SELECT DISTINCT bdocus.ano_pub
FROM bdocus INNER JOIN
descriptores_bdocus ON bdocus.nserie = descriptores_bdocus.nserie INNER JOIN
descriptores ON descriptores_bdocus.iddescriptor = descriptores.id
WHERE (bdocus.descriptores LIKE '%Victimización%')AND(bdocus.ano_pub LIKE CONCAT(@anyo,'%')) AND (bdocus.codigo_area LIKE CONCAT(@tema,'%')) AND(bdocus.codigo_colectivo LIKE CONCAT(@colectivo,'%')) AND (descriptores.nombre = @descriptores)
GROUP BY bdocus.ano_pub
ORDER BY bdocus.ano_pub DESC;
ELSE
SELECT DISTINCT bdocus.ano_pub
FROM bdocus INNER JOIN
descriptores_bdocus ON bdocus.nserie = descriptores_bdocus.nserie INNER JOIN
descriptores ON descriptores_bdocus.iddescriptor = descriptores.id INNER JOIN
autores_bdocus ON bdocus.nserie = autores_bdocus.nserie
WHERE (bdocus.descriptores LIKE '%Victimización%') AND (autores_bdocus.idautor = @autor) AND(bdocus.ano_pub LIKE CONCAT(@anyo,'%')) AND (bdocus.codigo_area LIKE CONCAT(@tema,'%')) AND(bdocus.codigo_colectivo LIKE CONCAT(@colectivo,'%')) AND (descriptores.nombre = @descriptores)
GROUP BY bdocus.ano_pub
ORDER BY bdocus.ano_pub DESC;
END IF;
END
参数是这样的:
IN `@anyo` varchar(20),IN `@tema` varchar(20),IN `@autor` int,
IN `@colectivo` varchar(30),IN `@descriptores` varchar(40)
我想要的值是 @anyo='2013'
、@tema='%'
、@autor=44439
、@colectivo='%'
和 @descriptores='Violencia sexual'
.
当我运行存储过程的第二部分时我的意思是:
SELECT DISTINCT bdocus.ano_pub
FROM bdocus INNER JOIN
descriptores_bdocus ON bdocus.nserie = descriptores_bdocus.nserie INNER JOIN
descriptores ON descriptores_bdocus.iddescriptor = descriptores.id INNER JOIN
autores_bdocus ON bdocus.nserie = autores_bdocus.nserie
WHERE (bdocus.descriptores LIKE '%Victimización%') AND (autores_bdocus.idautor = 44439) AND(bdocus.ano_pub LIKE CONCAT('%','%')) AND (bdocus.codigo_area LIKE CONCAT('%','%')) AND(bdocus.codigo_colectivo LIKE CONCAT('%','%')) AND (descriptores.nombre = 'Violencia sexual')
GROUP BY bdocus.ano_pub
ORDER BY bdocus.ano_pub DESC;
我得到了一行我想要的值。那么区别在哪里呢?提前致谢。
我认为你没有得到结果是因为条件,我的意思是,你的程序不会进入 'else' 部分,因此你没有得到那个结果。您可以做的是尝试 运行 分开第一个 select
SELECT DISTINCT bdocus.ano_pub
FROM bdocus INNER JOIN
descriptores_bdocus ON bdocus.nserie = descriptores_bdocus.nserie INNER JOIN
descriptores ON descriptores_bdocus.iddescriptor = descriptores.id
WHERE (bdocus.descriptores LIKE '%Victimización%')AND(bdocus.ano_pub LIKE CONCAT(@anyo,'%')) AND (bdocus.codigo_area LIKE CONCAT(@tema,'%')) AND(bdocus.codigo_colectivo LIKE CONCAT(@colectivo,'%')) AND (descriptores.nombre = @descriptores)
GROUP BY bdocus.ano_pub
ORDER BY bdocus.ano_pub DESC;
只是看看是否与整个过程的结果相同,如果您像 运行 过程时那样得到 0 行,可能就是这个原因。尝试更改条件,以便首先检查第一个 select(我认为这是您最需要的那个),然后再检查另一个。
应该是这样的
-- see that i changed the condition
IF @autor != 0 THEN
SELECT DISTINCT bdocus.ano_pub
FROM bdocus INNER JOIN
descriptores_bdocus ON bdocus.nserie = descriptores_bdocus.nserie INNER JOIN
descriptores ON descriptores_bdocus.iddescriptor = descriptores.id INNER JOIN
autores_bdocus ON bdocus.nserie = autores_bdocus.nserie
WHERE (bdocus.descriptores LIKE '%Victimización%') AND (autores_bdocus.idautor = @autor) AND(bdocus.ano_pub LIKE CONCAT(@anyo,'%')) AND (bdocus.codigo_area LIKE CONCAT(@tema,'%')) AND(bdocus.codigo_colectivo LIKE CONCAT(@colectivo,'%')) AND (descriptores.nombre = @descriptores)
GROUP BY bdocus.ano_pub
ORDER BY bdocus.ano_pub DESC;
END IF;
ELSE
SELECT DISTINCT bdocus.ano_pub
FROM bdocus INNER JOIN
descriptores_bdocus ON bdocus.nserie = descriptores_bdocus.nserie INNER JOIN
descriptores ON descriptores_bdocus.iddescriptor = descriptores.id
WHERE (bdocus.descriptores LIKE '%Victimización%')AND(bdocus.ano_pub LIKE CONCAT(@anyo,'%')) AND (bdocus.codigo_area LIKE CONCAT(@tema,'%')) AND(bdocus.codigo_colectivo LIKE CONCAT(@colectivo,'%')) AND (descriptores.nombre = @descriptores)
GROUP BY bdocus.ano_pub
ORDER BY bdocus.ano_pub DESC;
END
试一试并告诉我进展如何,其他可能的事情是您在调用过程时输入的参数
重要的是要指出 9.4. User-Defined Variables and routine parameters 13.1.15. CREATE PROCEDURE and CREATE FUNCTION Syntax 之间的区别,是不同的变量。
在您的示例中,@anyo
可能是 NULL
,而 `@anyo`
分配给了 '2013'
。
我正在尝试使用 Navicat 使用 mysql 执行一个存储过程,当我执行这个存储过程时,我得到了 0 行,但是当我执行我想要的存储过程部分时,我得到了 1 行这就是我想要的。存储过程是这样的:
BEGIN
#Routine body goes here...
IF @autor=0 THEN
SELECT DISTINCT bdocus.ano_pub
FROM bdocus INNER JOIN
descriptores_bdocus ON bdocus.nserie = descriptores_bdocus.nserie INNER JOIN
descriptores ON descriptores_bdocus.iddescriptor = descriptores.id
WHERE (bdocus.descriptores LIKE '%Victimización%')AND(bdocus.ano_pub LIKE CONCAT(@anyo,'%')) AND (bdocus.codigo_area LIKE CONCAT(@tema,'%')) AND(bdocus.codigo_colectivo LIKE CONCAT(@colectivo,'%')) AND (descriptores.nombre = @descriptores)
GROUP BY bdocus.ano_pub
ORDER BY bdocus.ano_pub DESC;
ELSE
SELECT DISTINCT bdocus.ano_pub
FROM bdocus INNER JOIN
descriptores_bdocus ON bdocus.nserie = descriptores_bdocus.nserie INNER JOIN
descriptores ON descriptores_bdocus.iddescriptor = descriptores.id INNER JOIN
autores_bdocus ON bdocus.nserie = autores_bdocus.nserie
WHERE (bdocus.descriptores LIKE '%Victimización%') AND (autores_bdocus.idautor = @autor) AND(bdocus.ano_pub LIKE CONCAT(@anyo,'%')) AND (bdocus.codigo_area LIKE CONCAT(@tema,'%')) AND(bdocus.codigo_colectivo LIKE CONCAT(@colectivo,'%')) AND (descriptores.nombre = @descriptores)
GROUP BY bdocus.ano_pub
ORDER BY bdocus.ano_pub DESC;
END IF;
END
参数是这样的:
IN `@anyo` varchar(20),IN `@tema` varchar(20),IN `@autor` int,
IN `@colectivo` varchar(30),IN `@descriptores` varchar(40)
我想要的值是 @anyo='2013'
、@tema='%'
、@autor=44439
、@colectivo='%'
和 @descriptores='Violencia sexual'
.
当我运行存储过程的第二部分时我的意思是:
SELECT DISTINCT bdocus.ano_pub
FROM bdocus INNER JOIN
descriptores_bdocus ON bdocus.nserie = descriptores_bdocus.nserie INNER JOIN
descriptores ON descriptores_bdocus.iddescriptor = descriptores.id INNER JOIN
autores_bdocus ON bdocus.nserie = autores_bdocus.nserie
WHERE (bdocus.descriptores LIKE '%Victimización%') AND (autores_bdocus.idautor = 44439) AND(bdocus.ano_pub LIKE CONCAT('%','%')) AND (bdocus.codigo_area LIKE CONCAT('%','%')) AND(bdocus.codigo_colectivo LIKE CONCAT('%','%')) AND (descriptores.nombre = 'Violencia sexual')
GROUP BY bdocus.ano_pub
ORDER BY bdocus.ano_pub DESC;
我得到了一行我想要的值。那么区别在哪里呢?提前致谢。
我认为你没有得到结果是因为条件,我的意思是,你的程序不会进入 'else' 部分,因此你没有得到那个结果。您可以做的是尝试 运行 分开第一个 select
SELECT DISTINCT bdocus.ano_pub
FROM bdocus INNER JOIN
descriptores_bdocus ON bdocus.nserie = descriptores_bdocus.nserie INNER JOIN
descriptores ON descriptores_bdocus.iddescriptor = descriptores.id
WHERE (bdocus.descriptores LIKE '%Victimización%')AND(bdocus.ano_pub LIKE CONCAT(@anyo,'%')) AND (bdocus.codigo_area LIKE CONCAT(@tema,'%')) AND(bdocus.codigo_colectivo LIKE CONCAT(@colectivo,'%')) AND (descriptores.nombre = @descriptores)
GROUP BY bdocus.ano_pub
ORDER BY bdocus.ano_pub DESC;
只是看看是否与整个过程的结果相同,如果您像 运行 过程时那样得到 0 行,可能就是这个原因。尝试更改条件,以便首先检查第一个 select(我认为这是您最需要的那个),然后再检查另一个。
应该是这样的
-- see that i changed the condition
IF @autor != 0 THEN
SELECT DISTINCT bdocus.ano_pub
FROM bdocus INNER JOIN
descriptores_bdocus ON bdocus.nserie = descriptores_bdocus.nserie INNER JOIN
descriptores ON descriptores_bdocus.iddescriptor = descriptores.id INNER JOIN
autores_bdocus ON bdocus.nserie = autores_bdocus.nserie
WHERE (bdocus.descriptores LIKE '%Victimización%') AND (autores_bdocus.idautor = @autor) AND(bdocus.ano_pub LIKE CONCAT(@anyo,'%')) AND (bdocus.codigo_area LIKE CONCAT(@tema,'%')) AND(bdocus.codigo_colectivo LIKE CONCAT(@colectivo,'%')) AND (descriptores.nombre = @descriptores)
GROUP BY bdocus.ano_pub
ORDER BY bdocus.ano_pub DESC;
END IF;
ELSE
SELECT DISTINCT bdocus.ano_pub
FROM bdocus INNER JOIN
descriptores_bdocus ON bdocus.nserie = descriptores_bdocus.nserie INNER JOIN
descriptores ON descriptores_bdocus.iddescriptor = descriptores.id
WHERE (bdocus.descriptores LIKE '%Victimización%')AND(bdocus.ano_pub LIKE CONCAT(@anyo,'%')) AND (bdocus.codigo_area LIKE CONCAT(@tema,'%')) AND(bdocus.codigo_colectivo LIKE CONCAT(@colectivo,'%')) AND (descriptores.nombre = @descriptores)
GROUP BY bdocus.ano_pub
ORDER BY bdocus.ano_pub DESC;
END
试一试并告诉我进展如何,其他可能的事情是您在调用过程时输入的参数
重要的是要指出 9.4. User-Defined Variables and routine parameters 13.1.15. CREATE PROCEDURE and CREATE FUNCTION Syntax 之间的区别,是不同的变量。
在您的示例中,@anyo
可能是 NULL
,而 `@anyo`
分配给了 '2013'
。