如何在存储过程中使用IF语句和局部变量

问题描述 投票:0回答:1

我正在“10.5.24-MariaDB-cll-lve”上的 MyPhpAdmin 中对此进行测试,我无法定义 SET 语句,例如“SET @x = 1;” (来自手册),它们不会失败,但以下语句(除非另一个集合)被标记为失败。我也尝试过DECLARE

如果我在过程中添加开始/结束,那么它将保存但无法执行,告诉我它失败并显示“...在第 1 行接近 NULL”。

我在这里使用动态 SQL,因为带有静态的 IF 语句也失败了。

我已将其导出并添加到此处:

DELIMITER $$ CREATE DEFINER=`wcipporg`@`localhost` PROCEDURE `BBBBBBBBB` (IN `SinceDate` DATE, IN `Totals` VARCHAR(10)) BEGIN DECLARE selectP1 VARCHAR(999); SET selectP1 = 'SELECT SinceDate AS `Sales Since`,'; IF Totals = 'N' THEN SET @selectP2 = 'wp_posts.post_title AS Plant, wp_terms.name AS Container,'; ELSE SET @selectP2 = "COALESCE(wp_posts.post_title, '### All Plants ###') AS `Plant Name`, COALESCE(wp_terms.name, '### All Containers ###') AS `Container`,"; END IF; SET @selectP3 = 'SUM(sold_plants.how_many) AS Total FROM wcipporg_Bungalook.sale AS sale INNER JOIN wcipporg_Bungalook.sold_plants AS sold_plants ON sale.txn_id = sold_plants.txn_id INNER JOIN wcipporg_wp596.wpi2_posts AS wp_posts ON sold_plants.plant_id = wp_posts.ID INNER JOIN wcipporg_wp596.wpi2_terms AS wp_terms ON sold_plants.container_id = wp_terms.term_id WHERE sale.txn_time >= SinceDate'; IF Totals = 'N' THEN SET @selectP3 = 'GROUP BY wp_posts.post_title ASC, wp_terms.name'; ELSE SET @selectP3 = 'GROUP BY wp_posts.post_title ASC, wp_terms.name WITH ROLLUP'; END IF; SET @query = CONCAT(@selectP1, @selectP2, @selectP3, @selectP4); PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt; END$$ DELIMITER ;
我尝试了各种变体、谷歌搜索和手册,错误消息显示了我的版本的手册,但没有说明如何找到特定的手册,我正在使用:

https://mariadb.com/ kb/en/文档/

stored-procedures mariadb
1个回答
0
投票
DECLARE selectP1 VARCHAR(999); SET selectP1 = 'SELECT SinceDate AS `Sales Since`,';
-->

SET @selectP1 = 'SELECT SinceDate AS `Sales Since`,';
即使用@variables,而不是声明变量。

(提示:更改参数和声明的变量,使其具有前导

_

,以区别于列名称等:
_Total
 等)

© www.soinside.com 2019 - 2024. All rights reserved.