Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL:instruções IF / THEN em procedimentos armazenados


Você tem alguns problemas até onde eu posso ver:
  1. Como David apontou, toda e qualquer instrução precisa ser encerrada por um ;
  2. Se você fizer um SELECT , certifique-se de que ele pode selecionar apenas um valor fazendo um LIMIT 1; Se você tem uma função agregada como min() então apenas um valor pode sair.
  3. Se você estiver escrevendo o procedimento usando o CREATE PROCEDURE ... sintaxe, não se esqueça de definir DELIMITER $$ antes do CREATE PROCEDURE ... END $$ corpo e um DELIMITER ; depois.
  4. Se você tiver várias instruções dentro de seu IF THEN ... END IF bloco, é uma boa idéia colocá-los dentro de um BEGIN ... END; bloquear.
  5. Se você tem um valor de retorno, como agência aqui, por que não torná-lo um FUNCTION name (arg1: INTEGER) RETURNS INTEGER em vez de um PROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER) . A função é muito mais versátil.
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 ;