이 MySQL 커서 코드로 도와주세요
-
05-07-2019 - |
문제
MSSQL에서 MySQL로 마이그레이션하려고합니다. 이 저장된 Proc는 영구 테이블에서 일부 열에 대한 온도 테이블을 생성 한 다음 커서를 사용하여 각 레코드의 Randnum 열을 임의의 숫자로 업데이트하고 데이터 세트를 선택합니다. 이 글을 쓰면서 커서를 우회 할 수 있다고 생각했습니다.
SELECT Id, Title, DateStart, Rand() FROM cms_News;
그러나 나는 너무 과감한 것을 바꾸고 싶지 않습니다. 지금 당장 DB를 변환하려고 노력하고 있기 때문입니다. 나는 돌아가서 나중에이 물건을 최적화 할 것입니다. SP는 다음과 같습니다. 편집하다: 이 예제에서 오류와 관련이없는 모든 코드를 제거했습니다. 또한, 나는 보았다 이것 오늘 온라인 으로이 문제를 겪고있는 유일한 사람이 아닌 것 같습니다. MySQL은 커서 선언의 구문이 마음에 들지 않습니다. 어떤 아이디어?
DELIMITER ;//
DROP PROCEDURE IF EXISTS `cms_NewsSelectMainPageNews`;//
CREATE PROCEDURE `cms_NewsSelectMainPageNews`
()
BEGIN
CREATE TEMPORARY TABLE tempNews
(
Id int NOT NULL,
Title nvarchar(250),
DateStart datetime,
RandNum float NULL
);
DECLARE Randomizer CURSOR
FOR SELECT Id FROM tempNews;
END;//
해결책
REPEAT
FETCH Randomizer INTO cursor_id;
IF NOT done THEN
UPDATE tempNews SET RandNum = rand();
WHERE id = @cursor_id;
END IF;
UNTIL done END REPEAT;
단위 화 세션 변수를 사용하고 있습니다 @cursor_id
프로 시저 감소 변수 대신 cursor_id
다음과 같이 다시 작성하십시오.
REPEAT
FETCH Randomizer INTO cursor_id;
IF NOT done THEN
UPDATE tempNews SET RandNum = rand();
WHERE id = cursor_id;
END IF;
UNTIL done END REPEAT;
또는 더 나은 것은 처음에 제안한 것처럼 임시 테이블을 전혀 제거하십시오.
이 진술에 관해서는 :
그러나 나는 너무 과감한 것을 바꾸고 싶지 않습니다. 지금 당장 DB를 변환하려고 노력하고 있기 때문입니다. 나는 돌아가서 나중에이 물건을 최적화 할 것입니다.
SQL Server
그리고 MySQL
~이다 크게 다른 플랫폼.
전환하기로 결정했을 때 이미 모든 것을 너무 과감하게 변경했습니다.
대부분의 경우 이전 코드를 복사하여 망치질 수는 없습니다. MySQL
.
여러 버전 사이에서 작동 할 수 있습니다 SQL Server
, 적어도 동일한 플랫폼의 버전간에 어떤 종류의 호환성을 유지하려는 시도가 있기 때문에, 이것은 확실히 포팅하는 데 효과적이지 않습니다. MySQL
.
내가 할 일은 코드의 모든 조각을 가져 와서 동일하게 생성하는 것입니다. 결과 이전 코드가했던 것처럼 사용합니다 행동 양식 가능한 한 간단하고 예측 가능합니다.
당신의 경우, @cursor_id
변수는 코드에서 초기에 초기화 될 수 있으며 저장 프로 시저에서 그 값을 사용할 수 있으며, 이는 예상치 못한 행동으로 이어질 수 있습니다.
이건이기 때문입니다 SQL Server
변수는 배치 범위를 가지고 있으며 MySQL
그들은 세션 범위를 가지고 있습니다.