Maison  >  Questions et réponses  >  le corps du texte

La création d'une procédure stockée MySQL a rencontré l'erreur 1064

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.

P粉041881924P粉041881924379 Il y a quelques jours559

répondre à tous(1)je répondrai

  • P粉883223328

    P粉8832233282023-09-13 00:09:27

    DELIMITERRequis 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.

    DELIMITER $$
    CREATE PROCEDURE()
    BEGIN
    ...
    END
    $$

    répondre
    0
  • Annulerrépondre