-2

我有两张桌子。一张表包含单词。其他表包含点。

table words:

id word


table points:

id wordid x y 

词列是唯一的。

我想编写存储过程,它接受输入当前 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 回答