1

これが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

4

2 に答える 2

1

2つのことが頭に浮かびます。

1)これは奇妙な構文です:

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

このselectステートメントが終了するまで、「fpkm」を使用することはできません。

2)少し厄介ですが、プロシージャから値を「返す」1つの方法は、それらを一時テーブルに配置することです。次に、呼び出しプロセスからそれらを選択します。

于 2012-11-01T14:30:10.290 に答える
1
SELECT fpkm, ( (rank / @row) *100 ) AS percentile INTO fpkm, percentile
                                                       ^^^^

宣言されていない変数があります。おそらくin_fpkmまたは他の名前である必要があります。

于 2012-11-01T14:30:54.113 に答える