Pergunta

Tentando migrar de MSSQL para MySQL. Este Proc é a criação de uma tabela temporária para algumas colunas de uma tabela permanente em seguida, usando um cursor para atualizar de cada registro coluna RandNum com um número aleatório e seleciona o conjunto de dados. Como eu estou escrevendo isso, eu pensei que eu poderia ignorar o cursor e só ...

SELECT Id, Title, DateStart, Rand() FROM cms_News;

Mas eu não quero mudar nada muito drástico, porque agora eu estou apenas tentando converter o DB. Vou voltar e otimizar essas coisas mais tarde. Aqui está o SP: EDIT: eu removi todo o código a partir deste exemplo que não tem nada a ver com o erro. Além disso, eu vi este online hoje e parece que eu sou não é o único que está tendo esse problema. MySQL não gosta da sintaxe da minha declaração de cursor. Todas as idéias?

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;//
Foi útil?

Solução

  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;

Você está usando @cursor_id variável de sessão não inicializado em vez de cursor_id variável declarada-procedimento

Rewrite da seguinte forma:

  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;

ou ainda melhor, apenas se livrar de sua tabela temporária em tudo, como você sugeriu, em primeiro lugar.


Como para esta declaração:

Mas eu não quero mudar nada muito drástico, porque agora eu estou apenas tentando converter o DB. Vou voltar e otimizar essas coisas mais tarde.

SQL Server e MySQL são muito diferentes plataformas.

Você já mudou tudo muito drástico quando decidiu mudar.

Na maioria dos casos, você não pode simplesmente copiar o código antigo e martelo para MySQL.

Seria possivelmente trabalho entre várias versões do SQL Server, pelo menos desde há tentativas de manter algum tipo de compatibilidade entre as versões da mesma plataforma, mas isso definitivamente não vai funcionar para portar para MySQL.

O que gostaria de fazer é tomar cada pedaço de seu código e certifique-se que produz o mesmo Resultados como o código antigo fez, usando métodos tão simples e previsível quanto possível .

No seu caso, a variável @cursor_id pôde ser inicializado no início do código e seu valor poderia ser usado pelo procedimento armazenado, o que levaria a qualquer tipo de comportamento inesperado.

Isto porque, em SQL Server as variáveis ??têm escopo lote, enquanto em MySQL eles têm escopo de sessão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top