Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL :instructions IF / THEN dans les procédures stockées

D'après ce que je peux voir, vous avez quelques problèmes :

  1. Comme l'a souligné David, chaque instruction doit être terminée par un ;
  2. Si vous faites un SELECT , assurez-vous qu'il ne peut sélectionner qu'une seule valeur en faisant un LIMIT 1; Si vous avez une fonction d'agrégation comme min() alors une seule valeur peut sortir.
  3. Si vous écrivez la procédure en utilisant le CREATE PROCEDURE ... syntaxe, n'oubliez pas de définir DELIMITER $$ avant le CREATE PROCEDURE ... END $$ body et un DELIMITER ; après.
  4. Si vous avez plusieurs déclarations dans votre IF THEN ... END IF bloc, c'est une bonne idée de les mettre à l'intérieur d'un BEGIN ... END; bloquer.
  5. Si vous avez une valeur de retour, comme l'agence ici, pourquoi ne pas en faire un FUNCTION name (arg1: INTEGER) RETURNS INTEGER au lieu d'un PROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER) . La fonction est beaucoup plus polyvalente.
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 ;