MySQL存储过程通过select作为参数

时间:2014-07-14 13:54:40

标签: mysql stored-procedures procedure

你能不能给我一个如何用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

1 个答案:

答案 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语句合并。

如果您的过程更复杂并且需要对每一行执行多个操作,那么您应该考虑使用游标。