1

私は最初の手順を書いていますが、エラーが発生します。エラーを削除行に減らしましたが、理由はわかりません。誰かがここで問題を見つけることができますか?それは変数ですか?

DROP PROCEDURE IF EXISTS MPT_PROC;
DELIMITER $$
CREATE PROCEDURE MPT_PROC
MODIFIES SQL DATA
BEGIN

    #-- DECLARE statements

    DECLARE v_user_id       INT DEFAULT 0;

    DECLARE no_more_rows    BOOLEAN;
    DECLARE v_loop_cntr     INT DEFAULT 0;
    DECLARE v_num_rows      INT DEFAULT 0;

    DECLARE c_userfiles CURSOR 
    FOR
        SELECT distinct f.user_id
        FROM MPT_STG_FILEUPLOAD f
        WHERE f.status = 'A';  #-- Accepted

        DECLARE CONTINUE HANDLER FOR NOT FOUND
        SET no_more_rows = TRUE;

        OPEN c_userfiles;

        #-- Loop through each user_id found as pending
        the_loop: LOOP

            FETCH c_userfiles INTO v_user_id;

            #-- Break out of the loop if
            #-- 1) there were no records, or
            #-- 2) we've processed them all.
            IF no_more_rows THEN
                CLOSE c_userfiles;
                LEAVE the_loop;
            END IF;

            DELETE FROM MPT_STG_FILEUPLOAD s
            WHERE s.user_id = v_user_id;

            COMMIT;  #--Commiting the changes for this user
        END LOOP the_loop;

    END IF;

END
DELIMITER ;
4

1 に答える 1

1

MySQLでは、DELETEステートメントで削除元のテーブルのエイリアスを指定することはできません。

 DELETE FROM MPT_STG_FILEUPLOAD WHERE user_id = v_user_id;

そして、コメント区切り文字としてのポンド記号を失います。二重ダッシュは、コメントの開始をマークするための標準です。END IF手順の終わりに向かって比類のないものがあるようです。

DROP PROCEDURE IF EXISTS MPT_PROC;
DELIMITER $$
CREATE PROCEDURE MPT_PROC
MODIFIES SQL DATA
BEGIN
  DECLARE v_user_id       INT DEFAULT 0;
  DECLARE no_more_rows    BOOLEAN;
  DECLARE v_loop_cntr     INT DEFAULT 0;
  DECLARE v_num_rows      INT DEFAULT 0;

  DECLARE c_userfiles CURSOR 
  FOR
  SELECT distinct f.user_id
    FROM MPT_STG_FILEUPLOAD f
   WHERE f.status = 'A';  -- Accepted

  DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET no_more_rows = TRUE;

  OPEN c_userfiles;

  -- Loop through each user_id found as pending
  the_loop: LOOP

    FETCH c_userfiles INTO v_user_id;

    -- Break out of the loop if
    -- 1) there were no records, or
    -- 2) we've processed them all.
    IF no_more_rows THEN
      CLOSE c_userfiles;
      LEAVE the_loop;
    END IF;

    DELETE FROM MPT_STG_FILEUPLOAD s
     WHERE s.user_id = v_user_id;

    COMMIT;  --Commiting the changes for this user
  END LOOP the_loop;

END$$
DELIMITER ;

がそのMPT_STG_FILEUPLOADテーブルの主キーでない場合user_id、プロシージャは「承認済み」としてマークされていない行を削除している可能性があります。user_idのテーブルに2つの行があり、一方の行が承認済みとしてマークされ、もう一方の行が承認されていない場合はどうなりますか。両方の行を削除しますか?

どこにも参照されていない2つの変数が宣言されているようv_loop_cntrですv_num_rows。必要がない場合は、コメントアウトすることをお勧めします。

この手順全体は、単一のSQLステートメントでより効率的に実行できます。

于 2012-07-06T22:07:24.173 に答える