3

私はmysqlでストアドプロシージャを学ぼうとしています。以下の例では SP が必要ないことはわかっていますが、これは私の学習目的のためだけです。行をループして行内の特定の列データを選択する方法を理解するためだけです。

テーブルの SELECT が次の構造を持つテーブルから 5 つのレコードを返すと仮定します -

テーブル名: t1 列: c1,c2,c3

5 つの行のそれぞれをループしたいと思います。各行について、varc1 = c1、varc2 = c2、varc3 = c3 となるように、列のセル データを SP 変数 varc1、varc2、varc3 に格納したいと考えています。ループ内でさらに計算するために、これらのvarc1、varc2、varc3を使用します。

私はストアド プロシージャが必要であると想定していますが、行の反復を実行し、ループ内で検討中の行の各列からデータを選択するアプローチを取得していません。

mysql/ ストアド プロシージャにはまったく新しいものです。ありがとう!

4

2 に答える 2

5

あなたが求めていることは、あなたが知っているように、ほとんどの問題に対して特に非効率的な解決策です. ただし、あなたが具体的にそれを要求したため、そして(非常にまれに)それが問題を解決する唯一の方法である(またはあなたが個人的にそれを解決する方法を理解する唯一の方法である)ためです. あなたが尋ねることを行う方法は次のとおりです。

t1 テーブルを作成します。例:

CREATE TABLE t1(id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, C1 INT, C2 INT, C3 INT);

記述した SELECT を実行します。

INSERT INTO  t1 SELECT NULL,c1,c2,c3 FROM the_table; 

Row-By-Agonising-Row "ReeBAR" 低効率ストアド プロシージャは次のとおりです。

プロシージャ用のスペースを準備し、区切り文字を設定します。

DROP PROCEDURE IF EXISTS ReeBAR;
DELIMITER ;;

手順を記述します。

CREATE PROCEDURE ReeBAR()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE varc1 INT DEFAULT 0;
DECLARE varc2 INT DEFAULT 0;
DECLARE varc3 INT DEFAULT 0;
SELECT COUNT(*) into n FROM t1;
set i=1;
WHILE i<=n DO 
  SELECT c1 FROM t1 WHERE id=i INTO varc1; 
  SELECT c2 FROM t1 WHERE id=i INTO varc2;
  SELECT c3 FROM t1 WHERE id=i INTO varc3;
  --queries which couldnt be made into set based queries go here---
  SET i = i + 1;
END WHILE;
End;

または、id 列が連続していない場合は、次のカーソル形式を使用できます。

CREATE PROCEDURE ReeBAR()
BEGIN
  DECLARE cursor_ID INT;
  DECLARE cursor_VAL VARCHAR;
  DECLARE done INT DEFAULT FALSE;
  DECLARE cursor_i CURSOR FOR SELECT c1,c2,c3 FROM t1;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  DECLARE varc1 INT DEFAULT 0;
  DECLARE varc2 INT DEFAULT 0;
  DECLARE varc3 INT DEFAULT 0;
  OPEN cursor_i;
  read_loop: LOOP
    FETCH cursor_i INTO varc1, varc2, varc3;
    IF done THEN
      LEAVE read_loop;
    END IF;
    --queries which couldnt be made into set based queries go here---
  END LOOP;
  CLOSE cursor_i;
END;

使用する手順を「終了」し、区切り文字をリセットすることを忘れないでください

;;
DELIMITER ;

最後に ReBAR 手順を実行します

CALL ReeBAR();

(コードは未テスト)

于 2013-05-07T22:47:22.967 に答える
1

CURSORS とループを使用して反復します。http://dev.mysql.com/doc/refman/5.0/en/cursors.html . お役に立てれば!

于 2012-10-13T21:48:00.260 に答える