Ajuda-me com este código cursor MySql
-
05-07-2019 - |
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;//
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.