簡體   English   中英

存儲過程和查詢執行之間的結果不同

[英]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'@anyo='2013' @tema='%'@autor=44439@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;

結果是我得到了想要的值。 那么區別在哪里? 提前致謝。

我認為您由於條件而沒有得到結果,我的意思是,您的程序不會進入“其他”部分,因此您沒有得到結果。 您可以做的是嘗試分別運行第一個選擇

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行(如在運行該過程時),則可能是原因。 嘗試更改條件,以便首先檢查第一個選擇(這是我最需要的一個),然后再選擇另一個。

應該是這樣的

-- 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之間的區別很重要 用戶定義的變量和例程參數13.1.15。 CREATE PROCEDURE和CREATE FUNCTION語法是不同的變量。

在您的示例中, `@anyo` @anyo可能為NULL並且將`@anyo`分配給'2013'

SQL Fiddle示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM