你能不能给我一个如何用SELECT结果调用prcd的建议?或建议我更好的解决方案..我对所有工作解决方案持开放态度
我有一个控制插入数据的程序......
CREATE PROCEDURE control_insert (
)
我需要将SELECT结果中的数据传递给过程......
SELECT t.c1, t.c2
FROM table t1
LEFT JOIN other_table t2
ON t1.id = t2.id
WHERE 1=1
关键是,我需要通过SELECT获取一些数据(大约6个表连接到基表)并且我需要在插入之前对每一行进行控制..每行应该满足某些条件..如果它没有'遇见他们,它应该跳过它并处理下一个......
程序应该如下:
CREATE PROCEDURE control_insert (
IN v_c1 INT,
IN v_c2 INT
)
BEGIN
IF v_c1 > 1 THEN
INSERT INTO controlled_table (id, type) VALUES (v_c1, v_c2);
ELSE
/* do nothing */
END IF;
END;
CALL control_insert ( SELECT .... );
你可以帮帮我吗?有没有可能通过MySQL做到这一点?我可以写一个PERL skript,但我想避免这种类型的解决方案...我只是一个只能用MySQL方式做到这一点
谢谢
EDIT1:我需要检查SELECT结果和LABEL的ID是否已存在于此表中特定日期...上面的代码只是一个示例来说明情况
解
我找到了解决方案......所以对其他访客来说:
调用程序:
CALL controlInsert();
程序正文:
CREATE PROCEDURE controlInsert()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE v_id INT;
DECLARE v_id_dupl INT;
DECLARE v_label INT;
DECLARE v_date DATE;
DECLARE v_type VARCHAR(100);
DECLARE v_category VARCHAR(255);
DECLARE v_user VARCHAR(255);
DECLARE v_country VARCHAR(255);
DECLARE c1 CURSOR FOR SELECT id, label, date, type, category, user, country FROM t1 LEFT JOIN ... /* whole select with 6 joins ended by ; */
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
## open cursor
OPEN c1;
## loop through the cursor
read_loop: LOOP
## fetch cursor into variables
FETCH c1 INTO v_id , v_label, v_date, v_type, v_category, v_user, v_country;
## check if there is any record
IF done THEN
LEAVE read_loop;
END IF;
## get count of existing records
SELECT count(*) INTO v_id_dupl
FROM
WHERE 1=1
AND id = v_id
AND label= v_label
AND date = v_date;
## if v_id_dupl = 0 => no rows found (ok to load)
IF (v_id_dupl = 0) THEN
INSERT INTO target_table (id, label, date, type, category, user, country)
VALUES (v_id , v_label, v_date, v_type, v_category, v_user, v_country);
END IF;
END LOOP;
CLOSE c1;
END
答案 0 :(得分:0)
如果这是你的存储过程所做的全部,那么你实际上并不需要它。你可以在一个声明中完成整个事情:
INSERT INTO controlled_table (id, type)
SELECT t.c1, t.c2
FROM table t1
LEFT JOIN other_table t2 ON t1.id = t2.id
WHERE something = somethingElse
AND t.c1 > 1
基本上,我刚刚将您的原始查询与您程序中的INSERT
语句合并。
如果您的过程更复杂并且需要对每一行执行多个操作,那么您应该考虑使用游标。