簡體   English   中英

MySQL-過程執行失敗不出錯

[英]Mysql - Procedure execution failed not error

當我要聲明此過程時,不聲明此代碼不報告任何報告
我不知道那是問題

我想在solr索引中使用此過程,但此過程不執行

DELIMITER $$
create procedure getAllStuff()
begin
declare category_id int(10);
declare category_name varchar default NULL;
declare stateCommands varchar(255) default NULL;
declare leafCats INT(10) default NULL;
declare tableName varchar(255) default NULL;
declare finished int(10) default 0;

declare leafCats_cursor CURSOR FOR select id,name from category where rgt=lft+1;
declare CONTINUE handler FOR NOT FOUND set finished=1;

create temporary table IF NOT EXISTS leafCats (
id int null primary key auto_increment,
category_id int,
tableName varchar(255)
);

open leafCats_cursor;
set_leafCats: LOOP
fetch leafCats_cursor into category_id,category_name;
if finished =1 then
leave set_leafCats
endif
set tableName=replace(catgeory_name,' ','_');
set tableName = concat('stuff_',tableName);
insert into leafCats values (NULL,category_id,tableName);
end loop set_leafCats;
close leafCats_cursor;


declare cats_cursor CURSOR FOR select category_id,category_name from leafCats;

open cats_cursor;
get_cats: LOOP
fetch cats_cursor into category_id,category_name;
if finished =1 then
leave set_leafCats;
endif;
if stateCommands != NULL then
set stateCommands=concat(sql,'select t.id as id,t.name,t.overall,c.id as 
category_id       from '.tableName .' t join category c where c.id=' . category_id);
else 
set stateCommands=concat(sql,'union all select t.id asid,t.name,t.overall,c.id  as     
category_id from '.tableName .' t join      category c where c.id=' . category_id);
end if;

end loop get_cats;
close cats_cursor;


PREPARE s1 FROM stateCommands;
EXECUTE s1;
DEALLOCATE PREPARE s1;


end @@
DELIMITER ;

當我將定界符更改為@@時出現此錯誤

錯誤1064(42000):您的SQL語法有錯誤; 檢查與您的MySQL服務器版本相對應的手冊以獲取正確的語法,以在'default NULL附近使用; 聲明stateCommands varchar(255)默認為NULL; 在第4行mysql> DELIMITER聲明leafCats';

我評論了幾點要考慮的問題:

我還添加了一個我認為您可能會發現有用的示例:

DELIMITER $$

DROP PROCEDURE IF EXISTS `getAllStuff`$$

CREATE PROCEDURE `getAllStuff`()
BEGIN
    DECLARE `finished` TINYINT(0) DEFAULT 0;
    DECLARE `category_id` INT UNSIGNED;
    DECLARE `category_name` VARCHAR(255);
    DECLARE `leafCats_cursor` CURSOR FOR
    SELECT `id`, `name` FROM `category` WHERE `rgt` = `lft` + 1;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET `finished` = 1;
    SET @`statecommands` := NULL;
    OPEN `leafCats_cursor`;
    `set_leafCats`: LOOP
        FETCH `leafCats_cursor` INTO `category_id`, `category_name`;
        IF `finished` = 1 THEN
            LEAVE `set_leafCats`;
        END IF;
        SET @statecommands := CONCAT(IF(@statecommands IS NOT NULL, CONCAT(@statecommands, ' \nUNION ALL'), ''), '
            SELECT
                `t`.`id` AS `id`,
                `t`.`name`,
                `t`.`overall`,
                `c`.`id` AS `category_id`
            FROM `', CONCAT('stuff_', REPLACE(`category_name`, ' ', '_'), '`'), ' `t`
                JOIN `category` `c` WHERE `c`.`id` = ', `category_id`);
    END LOOP `set_leafCats`;
    CLOSE `leafCats_cursor`;
    PREPARE `exec` FROM @`statecommands`;
    EXECUTE `exec`;
    DEALLOCATE PREPARE `exec`;
END$$

DELIMITER ;

您將獲得如下語句,該語句將被執行:

SELECT
    `t`.`id` AS `id`,
    `t`.`name`,
    `t`.`overall`,
    `c`.`id` AS `category_id`
FROM `stuff_category_1` `t`
    JOIN `category` `c` WHERE `c`.`id` = 1 
UNION ALL
SELECT
    `t`.`id` AS `id`,
    `t`.`name`,
    `t`.`overall`,
    `c`.`id` AS `category_id`
FROM `stuff_category_2` `t`
    JOIN `category` `c` WHERE `c`.`id` = 2 
UNION ALL
SELECT
    `t`.`id` AS `id`,
    `t`.`name`,
    `t`.`overall`,
    `c`.`id` AS `category_id`
FROM `stuff_category_3` `t`
    JOIN `category` `c` WHERE `c`.`id` = 3 
UNION ALL
SELECT
    `t`.`id` AS `id`,
    `t`.`name`,
    `t`.`overall`,
    `c`.`id` AS `category_id`
FROM `stuff_category_4` `t`
    JOIN `category` `c` WHERE `c`.`id` = 4;

暫無
暫無

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

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