2017-06-08 13 views
0

私は通常、自分自身で物事を把握しようとしますが、私はこれを困惑しています。MySQLカーソルUPDATE LOOP

私は1つのSugarCRMアカウントに、各アクティブユーザーに特定の番号を再割り当てしたいと思っています。私がこれを実行しようとするたびに、「ERROR 1064(42000):... Line 4」が続き、何が間違っているかわかりません。

こんにちは、私は通常、自分で物事を把握しようとするが、私はこれに困惑:

は、これは私がこれまでに作ったものです。

私は1つのSugarCRMアカウントに、各アクティブユーザーに特定の番号を再割り当てしたいと思っています。私がこれを実行しようとするたびに、「ERROR 1064(42000):... Line 4」が続き、何が間違っているかわかりません。

DELIMITER $$ 
    DROP PROCEDURE IF EXISTS assign_leads $$ 
    CREATE PROCEDURE assign_leads(num_rows INT) 
    BEGIN 
    SET num_rows = num_rows; 
    DECLARE i VARCHAR(255); 
    DECLARE exit_loop BOOLEAN;   
    DECLARE employee_cursor CURSOR FOR 
     SELECT users.id 
     FROM users 
     WHERE (((users.title)="South Carolina Qualifier") AND ((users.status)="Active")); 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_loop = TRUE; 

    OPEN employee_cursor; 
    employee_loop: LOOP 

    FETCH employee_cursor INTO i; 

     SET @sql_text1 = concat('UPDATE leads SET assigned_user_id = ',@i,' WHERE ((assigned_user_id IS NULL OR assigned_user_id = '1' OR assigned_user_id = '') AND do_not_call = '0' AND deleted = '0' AND status = 'New') LIMIT ',@num_rows,' 1;') 
     PREPARE stmt1 FROM @sql_text1; 
     EXECUTE stmt1; 
     DEALLOCATE PREPARE stmt1; 


     IF exit_loop THEN 
      CLOSE employee_cursor; 
       LEAVE employee_loop; 
     END IF; 
    END LOOP employee_loop; 
    END $$ 
    DELIMITER ; 

答えて

0

いくつかの注意事項:

  • SETDECLAREの後に配置する必要があります。
... 
    CREATE PROCEDURE assign_leads(num_rows INT) 
    BEGIN 
    -- SET num_rows = num_rows; 
    DECLARE i VARCHAR(255); 
    DECLARE exit_loop BOOLEAN;   
    DECLARE employee_cursor CURSOR FOR 
     SELECT users.id 
     FROM users 
     WHERE (((users.title)="South Carolina Qualifier") AND ((users.status)="Active")); 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_loop = TRUE; 
    SET num_rows = num_rows; 
    OPEN employee_cursor; 
... 

この割り当て(SET)はあまり意味がありません、それはnum_rowsの値を代入しますパラメータを同じnum_rowsパラメータに設定します。

  • はあなた@sql_text1変数からいくつかの文字をエスケープし、文の最後に;を追加する必要があります。
... 
/* 
SET @sql_text1 = concat(' 
    UPDATE leads SET assigned_user_id = ',@i,' 
    WHERE (
      (assigned_user_id IS NULL OR assigned_user_id = '1' OR assigned_user_id = '') AND 
      do_not_call = '0' AND deleted = '0' AND status = 'New' 
     ) 
    LIMIT ',@num_rows,' 1; 
') 
*/ 

SET @sql_text1 = concat(' 
    UPDATE leads SET assigned_user_id = ',@i,' 
    WHERE (
      (assigned_user_id IS NULL OR assigned_user_id = \'1\' OR assigned_user_id = \'\') AND 
      do_not_call = \'0\' AND deleted = \'0\' AND status = \'New\' 
     ) 
    LIMIT ',@num_rows,' 1; 
'); 
... 
+0

私は、クエリをchengedして、それが今のストアドプロシージャを受け入れますが、私は手順を使用しようとすると、CALLのassign_leads(100)それはERROR 1064(42000)になり:あなたのSQL構文でエラーが発生しています;右側の構文が1行目で 'NULL'の近くで使用されるようにMySQLサーバのバージョンに対応するマニュアルを確認してください。 – JoshS

+0

@JoshS:実行する前にクエリ(変数 '@ sql_text1')をチェックしてください。 'SELECT \' @ sql_text1 \ ';' – wchiquito

0

これはNUM_ROWS @「

 DELIMITER $$ 
     DROP PROCEDURE IF EXISTS assign_leads $$ 

    CREATE PROCEDURE assign_leads(num_rows INT) 
     BEGIN 
     DECLARE i VARCHAR(255); 
     DECLARE exit_loop BOOLEAN;   
     DECLARE employee_cursor CURSOR FOR 
      SELECT users.id 
      FROM users 
      WHERE (((users.title)="South Carolina Qualifier") AND((users.status)="Active")); 

     DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_loop = TRUE; 
     OPEN employee_cursor; 

    employee_loop: LOOP 
    FETCH employee_cursor INTO i; 
    SET @sql_text1 = concat(' 
    UPDATE leads SET assigned_user_id = ',@i,' 
    WHERE (
    (assigned_user_id IS NULL OR assigned_user_id = \'1\' OR assigned_user_id = \'\') AND 

do_not_call = \ '\ 0' AND削除= \ '0 \' AND状態= \ '新\' )LIMIT ...クエリです、 '1;' ); PREPARE stmt1 FROM @ sql_text1; EXECUTE stmt1; DEALLOCATE PREPARE stmt1;

IF exit_loop THEN 
    CLOSE employee_cursor; 
    LEAVE employee_loop; 
    END IF; 
    END LOOP employee_loop; 
    END $$ 
    DELIMITER ;enter code here