Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql如果不存在,会在存储过程中给我一个错误_Mysql_Stored Procedures_Phpmyadmin - Fatal编程技术网

Mysql如果不存在,会在存储过程中给我一个错误

Mysql如果不存在,会在存储过程中给我一个错误,mysql,stored-procedures,phpmyadmin,Mysql,Stored Procedures,Phpmyadmin,我在phpmyadmin中使用mysql有以下存储过程: CREATE DEFINER=`user`@`localhost` PROCEDURE `set_address`(IN `patient_street` VARCHAR(128), IN `patient_city` VARCHAR(45), IN `patient_post_code` VARCHAR(45), IN `patient_state_or_province` VARCHAR(45), IN `patient_count

我在
phpmyadmin
中使用
mysql
有以下存储过程:

CREATE DEFINER=`user`@`localhost` PROCEDURE `set_address`(IN `patient_street` VARCHAR(128), IN 
`patient_city` VARCHAR(45), IN `patient_post_code` VARCHAR(45), IN `patient_state_or_province` VARCHAR(45), IN `patient_country` VARCHAR(45)) 
NOT DETERMINISTIC NO SQL SQL SECURITY 
DEFINER 
BEGIN 
IF NOT EXISTS (SELECT a.address_id FROM address as a where a.street = patient_street and a.city = patient_city and a.post_code = patient_post_code and a.country = patient_country) 
THEN 
BEGIN 
INSERT INTO address (street, city, post_code, state_or_province, country) VALUES (patient_street, patient_city, patient_post_code, patient_state_or_province, patient_country); 
SELECT LAST_INSERT_ID(); 
END; 
ELSE 
BEGIN 
SELECT a.address_id FROM address as a where a.street = patient_street and a.city = patient_city and a.post_code = patient_post_code and a.country = patient_country 
END; 
END IF; 
END;
但是,我在
中发现了两个错误(如果不存在的话)

  • 无法识别的关键字。(如果不存在,则靠近
  • 意外标记。(近)

  • 就我个人而言,如果我需要编写一个执行指定操作的过程,并返回一个resultset,我会这样写:

    DELIMITER $$
    
    CREATE DEFINER=`user`@`localhost` PROCEDURE `set_address`
    (IN `patient_street`            VARCHAR(128)
    ,IN `patient_city`              VARCHAR(45)
    ,IN `patient_post_code`         VARCHAR(45)
    ,IN `patient_state_or_province` VARCHAR(45)
    ,IN `patient_country`           VARCHAR(45)
    )
    NOT DETERMINISTIC SQL SECURITY DEFINER
    BEGIN
      DECLARE li_address_id BIGINT DEFAULT NULL;
      -- check for existing row and get address_id
      SELECT a.address_id
        INTO li_address_id
        FROM address a
       WHERE a.street    = patient_street
         AND a.city      = patient_city
         AND a.post_code = patient_post_code
         AND a.country   = patient_country
       LIMIT 1 ;
      -- if we didn't find a matching row
      IF li_address_id IS NULL THEN
        -- add a row and get the new address_id
        INSERT INTO address (street, city, post_code, state_or_province, country) VALUES
        (patient_street, patient_city, patient_post_code, patient_state_or_province, patient_country);
        SELECT LAST_INSERT_ID() INTO li_address_id;
      END IF;
    
      -- return address_id (either found existing row, or newly added row) as a resultset
      SELECT li_address_id AS address_id;
    END$$
    
    DELIMITER ;
    

    如果存在一行,我们不需要运行两个
    SELECT
    语句。我们可以对该行进行检查,并通过单个
    SELECT
    获取地址id

    如果我们没有得到匹配的行,那么我们插入一行,并检索自动增量id

    在任何一种情况下(找到的行或添加的行),都可以将地址_id作为结果集返回。同样,我们可以使用一个SELECT语句而不是两个不同的语句来实现这一点


    对我来说,限制返回结果集的位置数和查询数据库的次数更有意义。

    每个if都必须有一个then和end if。insert语句也没有多大意义,不能将insert…值与这样的select混合使用。mysql也不需要数据库中的begin end块n if end if block.@P.Salmon我想首先检查地址是否已经存储在我的数据库中,否则存储它并获取它的相应id。您可能需要终止insert..values语句。@P.Salmon我更新了代码。仍然会收到相同的错误。您确实应该删除终止语句的要求-您丢失了;在end if和all end blocks之后,您还没有显示正在重置过程创建代码之前和之后的分隔符(您也没有显示)。