Originariamente inviata da
optime
2 cose:
1. converrai con me che scrivere "mi da errore" senza specificare l'errore non è utile
2. indenta bene il codice (tramite uno dei tanti sql beautifiers che trovi in giro) e quendo lo posti mettilo tra i tag "code"
Si, hai perfettamente ragione. Non avevo messo l'errore perchè è una stringa lunghissima, comunque la riporto:
Si sono verificati uno o più errori durante l'esecuzione della tua richiesta:
- La seguente query è fallita: "CREATE DEFINER=`zoozleit10872`@`%` PROCEDURE `create_tradelog_after_split`() NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN DROP TABLE IF EXISTS stock_tradelog_after_split CREATE TABLE stock_tradelog_after_split AS SELECT * from stock_tradelog DECLARE done INT DEFAULT 0; DECLARE split decimal(11,3) DEFAULT 1; DECLARE stock_name varchar(20) DEFAULT ""; DECLARE idx int(5) DEFAULT 1; DECLARE cur CURSOR FOR SELECT name, split_ratio, id FROM stock_tradelog WHERE type='SPLIT'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur; label: LOOP FETCH cur INTO stock_name,split,idx; UPDATE stock_tradelog_after_split SET quantity = CAST((quantity/split) AS decimal(11,3)) WHERE name = stock_name AND id < idx AND (type='BUY' OR type='SELL'); IF done = 1 THEN LEAVE label; END IF; END LOOP; CLOSE cur; END"
Messaggio di MySQL: #1064 - Errore di sintassi nella query SQL vicino a 'CREATE TABLE stock_tradelog_after_split AS SELECT * from stock_tradelog DECLARE' linea 3
Questo accade quando aggiungo le seguenti righe di codice alla procedura:
codice:
BEGIN
DROP TABLE IF EXISTS stock_tradelog_after_split
CREATE TABLE stock_tradelog_after_split AS SELECT * from stock_tradelog
....
mentre il codice seguente senza quelle due righr funziona perfettamente:
codice:
BEGIN DECLARE done INT DEFAULT 0;
DECLARE split decimal(11, 3) DEFAULT 1;
DECLARE stock_name varchar(20) DEFAULT "";
DECLARE idx int(5) DEFAULT 1;
DECLARE cur CURSOR FOR
SELECT
name,
split_ratio,
id
FROM
stock_tradelog
WHERE
type = 'SPLIT';
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET
done = 1;
OPEN cur;
label : LOOP
FETCH cur INTO stock_name,
split,
idx;
UPDATE
stock_tradelog_after_split
SET
quantity = CAST(
(quantity / split) AS decimal(11, 3)
)
WHERE
name = stock_name
AND id < idx
AND (
type = 'BUY'
OR type = 'SELL'
);
IF done = 1 THEN LEAVE label;
END IF;
END LOOP;
CLOSE cur;
END