这是 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 |
当我插入触发触发器的行时,它会失败(为清楚起见,修剪了不相关的列)
INSERT INTO `mctp`.`gene_expression_cufflinks_gene` (
`gene_id` ,
`fpkm`,
`fpkm_percentile_compendium` ,
`fpkm_percentile_origin_tissue` ,
`fpkm_percentile_collection_tissue` ,
`fpkm_percentile_sample_cancer`
)
VALUES ('ENSG00000239906','555', NULL , NULL , NULL , NULL , NULL , NULL)
最终,我希望我的触发器将计算出的 NEW 百分位值插入到要插入的行中,例如 NEW.fkpm_percentile_compendium。出于性能原因,需要预先计算这些百分位值,因为该表将超过 500m 行,并且最终必须根据关系计算其他百分位值,从而导致过多的连接。
我有一个模糊的想法,即解决方案应该涉及 SELECT INTO 变量而不是简单的 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> 如何在同一程序中访问我选择 INTO 的新变量?
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 匹配的所有其他行上运行该过程。呵呵。
xoxoxox