-2

私は2つのテーブルを持っています。1 つのテーブルには単語が含まれています。他のテーブルにはポイントが含まれています。

table words:

id word


table points:

id wordid x y 

word 列は一意です。

入力の現在の x 値と word|y 値のリストを受け取るストアド プロシージャを書きたいと思います。

例えば:

それは最初の単語の表の行です:

id word
1  Carrot
2  Apple
3  Potato

プロシージャーを呼び出します StoreData(x = 5, words = { Carrot:123, Onion:321 })

その結果、次のようになります。

Words table:

  id word
  1  Carrot
  2  Apple
  3  Potato
  4  Onion 


Points table:    
id wordid x  y 
1    1    5 123 
2    4    5 321

どうやってするの?

4

1 に答える 1

2

構造化データをパラメータとしてストアド プロシージャに渡すことはできません。最初に構造化データをどこかの (一時) テーブルに挿入してから、プロシージャ内からそのテーブルの内容を読み取る必要があります。そのため、宛先テーブルに直接挿入することもできます。

INSERT IGNORE INTO Words (word) VALUES ('Carrot'), ('Onion');

INSERT INTO Points (wordid, x, y)
  SELECT Words.id, 5, y
  FROM   Words NATURAL JOIN (
      SELECT 'Carrot' AS word, 123 AS y
    UNION ALL
      SELECT 'Onion'  AS word, 321 AS y
  ) AS t;

sqlfiddleで参照してください。

(ちなみに、私の実体化されtたテーブルは、基本的に、ストアド プロシージャを呼び出す前に作成してデータを入力する必要があるテーブルです):

DELIMITER ;;
CREATE PROCEDURE StoreData(IN x INT) BEGIN
  INSERT IGNORE INTO Words SELECT word FROM args;
  INSERT IGNORE INTO Points (wordid, x, y)
    SELECT Words.id, 5, y FROM Words NATURAL JOIN args;
END;;
DELIMITER ;

DROP   TEMPORARY TABLE IF EXISTS args;
CREATE TEMPORARY TABLE args (word VARCHAR(20), y INT);
INSERT INTO args VALUES ('Carrot', 123), ('Onion', 321);
CALL StoreData(5);
于 2012-06-29T17:48:36.207 に答える