sql >> Databáze >  >> RDS >> Mysql

MySQL:příkazy IF / THEN v uložených procedurách

Pokud vidím, máte několik problémů:

  1. Jak zdůraznil David, každý příkaz musí být ukončen znakem ;
  2. Pokud provedete SELECT , raději se ujistěte, že může vybrat pouze jednu hodnotu provedením LIMIT 1; Pokud máte agregační funkci jako min() pak může vyjít pouze jedna hodnota.
  3. Pokud proceduru píšete pomocí CREATE PROCEDURE ... syntaxi, nezapomeňte nastavit DELIMITER $$ před CREATE PROCEDURE ... END $$ tělo a DELIMITER ; po.
  4. Pokud máte v IF THEN ... END IF více příkazů bloku, je dobré je umístit do BEGIN ... END; blokovat.
  5. Pokud máte návratovou hodnotu, jako zde agentura, proč z ní neudělat FUNCTION name (arg1: INTEGER) RETURNS INTEGER místo PROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER) . Funkce je mnohem všestrannější.
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. Jak vložit BLOB do Oracle s Pythonem?

  2. Únik z jednoduchých uvozovek v JDBC pomocí MySql

  3. Jak automaticky načíst MySQL při spuštění na OS X Yosemite / El Capitan

  4. Jak mohu chránit uživatelské jméno a heslo MySQL před dekompilací?