문제

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 그들은 세션 범위를 가지고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top