1

SQL Server 2005 データベースを MySQL に変換中ですが、ストアド プロシージャに問題があります。MySQL ストアド プロシージャは初めてなので、変換に問題があると確信していますが、表示されません。

ストアド プロシージャは、vb.net アプリケーションでデータ グリッド ビューを設定するために使用される一時テーブルを生成することになっています。しかし、「Data No Data - Zero rows fetched, selected or processing.」というエラーが表示されます。十分に単純に思えますが、ストアド プロシージャの選択プロシージャは、クエリとして実行するだけでデータを取得するため、エラーの理由がわかりません。

変換するストアドプロシージャが数百あり、最初のストアドプロシージャでこの問題が発生しているため、誰かが理由を教えてくれることを本当に望んでいます。

ストアド プロシージャは次のとおりです。

DELIMITER $$

DROP PROCEDURE IF EXISTS `usp_get_unassigned_media`$$

CREATE DEFINER=`showxx`@`67.111.11.110` PROCEDURE `usp_get_unassigned_media`()
BEGIN
    /* GET CURSOR WITH LOCAL LOCATIONS */
    DECLARE intKey INT; 
    DECLARE dteDateInserted DATETIME;
    DECLARE vchIdField VARCHAR(200); 
    DECLARE vchValueField VARCHAR(200); 
    DECLARE intLastKey INT;


/*TAKE OUT SPECIFIC PLAYLIST ITEMS IF TOO SLOW*/
DECLARE csrMediaToBeAssigned CURSOR FOR
SELECT
  `media`.`key`             AS `key`,
  `media`.`date_inserted`   AS `date_inserted`,
  `media_detail_types`.`id` AS `id`,
  `media_details`.`value`   AS `value`
FROM (`media`
   LEFT JOIN (`media_detail_types`
          JOIN `media_details`
        ON ((`media_detail_types`.`key` = `media_details`.`detail_key`)))
     ON ((`media_details`.`media_key` = `media`.`key`)))

WHERE ((`media`.`is_assigned` = 0)
       AND ((`media_detail_types`.`id` = 'Volume Name')
         OR (`media_detail_types`.`id` = 'Drive Id')))
ORDER BY `media`.`key`,`media`.`date_inserted`,`media_detail_types`.`id`;

OPEN csrMediaToBeAssigned;

DROP TEMPORARY TABLE IF EXISTS temp_unassigned_media;
CREATE TEMPORARY TABLE temp_unnassigned_media 
    (temp_key INT, DateInserted DATETIME, IdField VARCHAR(200), ValueField VARCHAR (200)) 
    ENGINE=MEMORY;
SET intLastKey = 0;
/*--GET FIRST RECORD */

FETCH FROM csrMediaToBeAssigned
    INTO intKey, dteDateInserted, vchIdField, vchValueField;
/*--LOOP THROUGH CURSOR */
WHILE intLastKey = 0 DO
    /*--DATA SHOULD BE IN DRIVE ID THEN VOLUME NAME */

    INSERT INTO  temp_unnassigned_media
        VALUES (intKey, dteDateInserted, vchValueField, '');
    FETCH NEXT FROM csrMediaToBeAssigned
        INTO intKey, dteDateInserted, vchIdField, vchValueField;

    UPDATE temp_unnassigned_media
        SET IdField = vchValueField
        WHERE temp_key = temp_key;
    FETCH NEXT FROM csrMediaToBeAssigned
        INTO intKey, dteDateInserted, vchIdField, vchValueField;

END WHILE;
SELECT * 
    FROM temp_unnassigned_media 
    ORDER BY date_inserted; 
CLOSE csrMediaToBeAssigned;     
/*DEALLOCATE csrMediaToBeAssigned   */
/*DROP TABLE #temp_unnassigned_media    */

END$$

DELIMITER ;
4

1 に答える 1

0

そのWHILEループが終了する条件に達することはありません。intLastKey変数を初期化しますが、変更されることはないため、結果セット全体をフェッチします。最後のレコードの後で再度フェッチすると、例外がスローされます。

規範的なパターンは、条件がトリガーCONTINUE HANDLERされたときにMySQLが実行するを宣言することです。NOT FOUNDハンドラーは通常、変数を設定するために使用されます。変数をテストして、ループをいつ終了するかがわかります。

あなたの場合、ステートメントの後、DECLARE CURSORステートメントの前にこの行を追加するだけOPENで十分であるように見えます。

DECLARE CONTINUE HANDLER FOR NOT FOUND SET intLastKey = 1;
于 2012-12-19T17:21:07.363 に答える