MySQL使用触发器中的select语句调用过程;不允许从触发器返回结果集";

MySQL使用触发器中的select语句调用过程;不允许从触发器返回结果集";,mysql,stored-procedures,triggers,procedures,Mysql,Stored Procedures,Triggers,Procedures,下面是一个SQL向导。以前也有人问过类似的问题,我知道问题出在哪里,但我在重写过程中的select语句以避免返回结果集和触发器想要的全局变量时遇到了问题 作为一个背景,我在这里试图完成的是使用一组触发器来调用过程,该过程将在插入或更新行时计算一个值相对于表中具有相同gene_id的其他行的百分比 (使用PMA分隔符设置为|) 计算百分位值的过程运行良好 DROP PROCEDURE IF EXISTS gecg_relative_expr_compendium | CREATE PROCEDU

下面是一个SQL向导。以前也有人问过类似的问题,我知道问题出在哪里,但我在重写过程中的select语句以避免返回结果集和触发器想要的全局变量时遇到了问题

作为一个背景,我在这里试图完成的是使用一组触发器来调用过程,该过程将在插入或更新行时计算一个值相对于表中具有相同gene_id的其他行的百分比

(使用PMA分隔符设置为|)

计算百分位值的过程运行良好

DROP PROCEDURE IF EXISTS gecg_relative_expr_compendium |

CREATE PROCEDURE gecg_relative_expr_compendium( IN in_gene_id varchar(24), IN in_fpkm double, OUT percentile float(4,2) ) 
BEGIN 
    SET @row := 0;
    SELECT fpkm, ( (rank / @row) *100 ) AS percentile
    FROM (
        SELECT fpkm, @row := @row +1 AS rank, gene_id
        FROM gene_expression_cufflinks_gene
        WHERE gene_id = in_gene_id
        ORDER BY fpkm ASC
    ) AS p
    WHERE fpkm = in_fpkm;
END |
我可以这样称呼它:

CALL gecg_relative_expr_compendium('ENSG00000251948', 19367800, @percentile)
返回:

fpkm    percentile
19367800    100.0000
还有我的扳机:

DROP TRIGGER IF EXISTS insert_gecg_relative_expr |

CREATE TRIGGER insert_gecg_relative_expr

 BEFORE INSERT ON `gene_expression_cufflinks_gene` FOR EACH ROW  
 BEGIN  
    CALL gecg_relative_expr_compendium(NEW.gene_id, NEW.fpkm, NEW.fpkm_percentile_compendium) ;
 END  |
当我插入一行触发触发器时,它失败了(为了清晰起见,对不相关的列进行了修剪)

最后,我希望触发器将计算出的新百分位值插入到正在插入的行中,例如NEW.fkpm_percentile_compendium。出于性能原因,有必要预先计算这些百分位值,因为此表的行数将大于500米,最终必须根据关系计算其他百分位值,从而导致过度联接

我有一个模糊的想法,解决方案应该包括SELECT到变量中,而不是简单的SELECT语句,但这破坏了我的过程

DROP PROCEDURE IF EXISTS gecg_relative_expr_compendium |

CREATE PROCEDURE gecg_relative_expr_compendium( IN in_gene_id varchar(24), IN in_fpkm double, OUT percentile float(4,2) ) 
BEGIN 
    SET @row := 0;
    SELECT fpkm, ( (rank / @row) *100 ) AS percentile INTO fpkm, percentile
    FROM (
        SELECT fpkm, @row := @row +1 AS rank, gene_id
        FROM gene_expression_cufflinks_gene
        WHERE gene_id = in_gene_id
        ORDER BY fpkm ASC
    ) AS p
    WHERE fpkm = in_fpkm;
END |
给我:

#1327 - Undeclared variable: fpkm 
所以我的问题是

1> 如何在同一过程中访问我选择的新变量

2> 如何在不返回结果集的情况下将变量返回到触发器

非常感谢你的帮助


更新>>以下是工作程序和触发器:

DROP PROCEDURE IF EXISTS gecg_relative_expr_compendium |
CREATE PROCEDURE gecg_relative_expr_compendium( IN in_gene_id varchar(24), IN in_fpkm double, OUT out_fpkm double, OUT out_percentile float(5,2)  ) 
BEGIN 
    SET @row := 0;
    SELECT fpkm, ( (rank / @row) *100 ) AS percentile
    FROM (
        SELECT fpkm, @row := @row +1 AS rank, gene_id
        FROM gene_expression_cufflinks_gene
        WHERE gene_id = in_gene_id
        ORDER BY fpkm ASC
    ) AS p
    WHERE fpkm = in_fpkm
    LIMIT 1 
    INTO out_fpkm, out_percentile;
END |



DROP TRIGGER IF EXISTS insert_gecg_relative_expr |

CREATE TRIGGER insert_gecg_relative_expr

 BEFORE INSERT ON `gene_expression_cufflinks_gene` FOR EACH ROW  
 BEGIN  
    CALL gecg_relative_expr_compendium(NEW.gene_id, NEW.fpkm, @f, @p);
    SET NEW.fpkm_percentile_compendium = @p;
 END  
|
触发器在插入行时对行运行百分位数计算。现在进入下一个任务,在与此gene_id.guhhh匹配的所有其他行上运行该过程


xoxoxox

我想到两件事:

1) 这是一种奇怪的语法:

SELECT fpkm, ( (rank / @row) *100 ) AS percentile INTO fpkm, percentile  
在此select语句之后才能使用“fpkm”

2) 这有点过分,但从过程中“返回”值的一种方法是将它们放入临时表中。然后从调用过程中选择它们

SELECT fpkm, ( (rank / @row) *100 ) AS percentile INTO fpkm, percentile
                                                       ^^^^

有一个未声明的变量。可能应该是
in_fpkm
或其他名称。

您好-这是真的,我最终使用了out_fpkm来处理这个变量,但是ethrbunny的回答对解决整个问题有点帮助,因为我必须在整个select和子查询之后移动INSTO语句才能使它工作。尽管如此,我还是投了所有人的票。谢谢:)
SELECT fpkm, ( (rank / @row) *100 ) AS percentile INTO fpkm, percentile
                                                       ^^^^