sql >> Databasteknik >  >> RDS >> Mysql

MySQL:IF / THEN-satser i lagrade procedurer

Du har några problem såvitt jag kan se:

  1. Som David påpekade måste varje påstående avslutas med en ;
  2. Om du gör en SELECT , se till att den bara kan välja ett värde genom att göra en LIMIT 1; Om du har en aggregatfunktion som min() då kan bara ett värde komma ut.
  3. Om du skriver proceduren med CREATE PROCEDURE ... syntax, glöm inte att ställa in DELIMITER $$ före CREATE PROCEDURE ... END $$ body och en DELIMITER ; efter.
  4. Om du har flera påståenden i din IF THEN ... END IF block, är det en bra idé att placera dem i en BEGIN ... END; blockera.
  5. Om du har ett returvärde, som byrån här, varför inte göra det till ett FUNCTION name (arg1: INTEGER) RETURNS INTEGER istället för ett PROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER) . Funktionen är mycket mer mångsidig.
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 ;


  1. PostgreSQL:ordning efter kolumn, med specifikt NON-NULL-värde LAST

  2. Arbeta med evenemang i MySQL

  3. MySQL-resultat som kommaseparerad lista

  4. prestationsstraff för strängar som primärnycklar?