Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:istruzioni IF / THEN nelle procedure memorizzate

Per quanto posso vedere, hai riscontrato alcuni problemi:

  1. Come ha sottolineato David, ogni singola istruzione deve essere terminata da un ;
  2. Se esegui un SELECT , assicurati che possa selezionare solo un valore eseguendo un LIMIT 1; Se hai una funzione aggregata come min() allora può uscire un solo valore.
  3. Se scrivi la procedura usando il CREATE PROCEDURE ... sintassi, non dimenticare di impostare DELIMITER $$ prima del CREATE PROCEDURE ... END $$ corpo e un DELIMITER ; dopo.
  4. Se hai più istruzioni all'interno del tuo IF THEN ... END IF blocco, è una buona idea inserirli all'interno di un BEGIN ... END; blocco.
  5. Se hai un valore di ritorno, come l'agenzia qui, perché non renderlo un FUNCTION name (arg1: INTEGER) RETURNS INTEGER invece di un PROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER) . La funzione è molto più versatile.
DELIMITER $$
CREATE PROCEDURE name(arg1 INTEGER, arg2 INTEGER, ...)
BEGIN

  SELECT SET agency = 
    COALESCE((SELECT org_agency_o_id 
            FROM orgs_agencies 
            WHERE org_agency_code = maj_agency_cat) LIMIT 1,
    (SELECT min(org_id) FROM orgs     
    WHERE org_name LIKE CONCAT('U.S.',SUBSTRING(maj_agency_cat,5)))); 

  IF agency IS NULL THEN BEGIN
    -- execute multiple queries   
    INSERT INTO orgs (org_name
                     ,org_name_length
                     ,org_type
                     ,org_sub_types) 
    VALUES (CONCAT('U.S. ',SUBSTRING(maj_agency_cat,5))
           ,LENGTH(CONCAT('U.S. ',SUBSTRING(maj_agency_cat,5)))
           ,'org','Org,GovernmentEntity,Federal,Agency');

    SET agency = LAST_INSERT_ID();
  END; END IF;
END $$

DELIMITER ;