これが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ステートメントではなくSELECT INTO変数を含める必要があるという漠然とした考えがありますが、これは私の手順を壊します。
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