在MySQL中创建具有多个输出类别的存储过程

z9zf31ra  于 2022-11-21  发布在  Mysql
关注(0)|答案(1)|浏览(124)

我正在MySQL Workbench中工作,并使用以下SQL示例数据。https://www.databasestar.com/sample-database-superheroes/
我的图表附在下面。
如何创建一个存储过程,在其中输入超级英雄的名字(例如Firebird)并获得他们拥有的特定火主题超能力?
到目前为止,我的代码看起来像这样:

DROP PROCEDURE IF EXISTS Elemental_Heroes;
DELIMITER $$
CREATE PROCEDURE Elemental_Heroes(
IN HeroName VARCHAR(250),
OUT ElementalCat VARCHAR(250))
BEGIN
    DECLARE credit DECIMAL DEFAULT 0;

    SELECT 
    s.id,
    s.superhero_name,
    sp.power_name
        FROM superhero s
            LEFT JOIN hero_power hp ON s.id = hp.hero_id
            LEFT JOIN superpower sp ON hp.power_id = sp.id
                WHERE sp.id IN (56,79,90,104,140) AND s.superhero_name = HeroName
                    GROUP BY s.id, s.superhero_name, sp.power_name;

    IF
    ELSE
    
END$$
DELIMITER ;

CALL Elemental_Heroes(Firebird);

其中IF ELSE部分只是我知道最终必须出现的条件语句的占位符,整个elect部分(减去s.superhero_name = HeroName)按预期运行。
我也想知道是否有任何方法可以输出多个类别。因为火鸟有火焰控制,火焰抗性,和耐热抗性,我希望所有这三个类别都是输出时,我调用Elemental_Heroes(Firebird)

iyr7buue

iyr7buue1#

样。
创建源数据

CREATE TABLE main
SELECT 1 id, 'Name 1' name UNION SELECT 2, 'Name 2' UNION SELECT 3, 'Name 3';
CREATE TABLE slave
SELECT 1 id, 1 val UNION SELECT 1, 2 UNION SELECT 2, 3 UNION 
  SELECT 2, 1 UNION SELECT 3, 2 UNION SELECT 3, 3;

创建通过提供的val值检索name列表的存储过程

CREATE PROCEDURE get_id_by_val (IN in_val INT, OUT out_names_list TEXT)
BEGIN
  SELECT JSON_ARRAYAGG(name) INTO out_names_list 
  FROM main
  JOIN slave USING (id)
  WHERE slave.val = in_val;
END

SP通过in_val输入参数中提供的值查询名称,并将找到的值保存到out_names_list输出参数中
使用SP

CALL get_id_by_val(3, @output);
-- retrieve the list as solid JSON array
SELECT @output;
-- retrieve the same in separate rows
SELECT name FROM JSON_TABLE(@output, '$[*]' COLUMNS (name VARCHAR(255) PATH '$')) jsontable

在CALL中,我们为in_val参数提供标准值,并使用用户定义的变量@output作为放置输出的位置。
实心JSON数组输出
| @输出|
| - -|
| [“姓名2”、“姓名3”]|
输出被解析为分隔值
| 姓名|
| - -|
| 姓名2|
| 姓名3|
fiddle

相关问题