簡體   English   中英

MySQL存儲過程通過選擇作為參數

[英]MySQL stored procedure pass select as parameter

您能否給我一個建議,如何用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結果的ID和LABEL是否已在特定日期的表中...上面的代碼僅是演示這種情況的示例


我已經找到了解決方案...因此對於其他訪客:

調用過程:

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

如果這就是您的存儲過程所做的全部,那么您實際上就不需要它了。 您可以在一個語句中完成全部操作:

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語句組合在一起。

如果您的過程更復雜,並且需要在每一行上執行多個操作,則應使用游標進行調查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM