Je souhaite créer une procédure stockée dans MySQL, mais j'ai rencontré une erreur 1064 :
错误代码:1064 您的SQL语法有误;请检查与您的MariaDB服务器版本相对应的手册,以获取正确的语法使用方法,位于第2行附近的 'ZID_TRANSAKSI VARCHAR(64), ZTGL1 DATE, ZTGL2 DATE ) BEGIN DECLARE ...' 查询:DELIMITER; 错误代码:1064 您的SQL语法有误;请检查与您的MariaDB服务器版本相对应的手册,以获取正确的语法使用方法,位于第1行附近的 'DELIMITER'
Voici la requête pour la procédure stockée que je souhaite créer :
DELIMITER $$ CREATE PROCEDURE HITUNGMASUK ( ZID_TRANSAKSI VARCHAR(64), ZTGL1 DATE, ZTGL2 DATE ) BEGIN DECLARE done INT DEFAULT FALSE; DECLARE PTAHUN VARCHAR(4); DECLARE PBULAN VARCHAR(2); DECLARE PHITUNG INTEGER DEFAULT 0; DECLARE CEKKARTUSTOK INTEGER DEFAULT 0; DECLARE PID_BARANG VARCHAR(255) DEFAULT 'X'; DECLARE PPANJANG INTEGER DEFAULT 0; DECLARE CEKKARTUSTOK CURSOR FOR SELECT B.id_barang, SUM(B.total_Panjang) AS PANJANG FROM transaksi_gudang A, line_item_barang B WHERE A.ID_Transaksi LIKE ZID_TRANSAKSI AND A.Tanggal BETWEEN ZTGL1 AND ZTGL2 AND B.ID_GR = A.ID_Transaksi GROUP BY B.id_barang; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; PTAHUN = YEAR(ZTGL1); PBULAN = MONTH(ZTGL1); OPEN CEKKARTUSTOK; teams_loop: LOOP FETCH CEKKARTUSTOK INTO PID_BARANG,PPANJANG; IF PID_BARANG = 'X' THEN INSERT INTO kartustok(TAHUN,BULAN,ID_BARANG,KODE_GUDANG,MASUK) VALUES (); END IF; IF done THEN LEAVE teams_loop; END IF; END LOOP; CLOSE CEKKARTUSTOK; SELECT FROM kartustok C WHERE C.TAHUN = PTAHUN AND C.BULAN = PBULAN AND C.ID_BARANG = P END $$ DELIMITER;
Pourquoi ma requête apparaît-elle错误代码:1064
? Comment puis-je le réparer ?
J'ai déjà utilisé la base de données ORACLE et maintenant je viens de commencer à utiliser MySQL. S'il y a des différences dont je ne suis pas au courant, veuillez me le faire savoir.
DELIMITER
Requis uniquement si vous créez une procédure stockée dans le client de ligne de commande, pour faire la distinction entre les délimiteurs réguliers et les délimiteurs à l'intérieur des blocs BEGIN END.Dans votre exemple, vous définissez un séparateur
$$ CREATE PROCEDURE HITUNGMASUK
qui n'est probablement pas ce que vous voulez vraiment.DELIMITER $$
Doit être exécuté comme une commande unique, non connectée à une définition de procédure stockée.