2015-02-17 2 views
0

У меня есть эта процедура:MySQL: нулевая проверка на основе, если оператор

DELIMITER // 
CREATE PROCEDURE add_package(nam VARCHAR(255), pack_id INT, lib_id INT, descrip TEXT) 
    BEGIN 
    DECLARE ind INT; 
    DECLARE `_rollback` BOOL DEFAULT 0; 
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1; 
    START TRANSACTION; 
     INSERT INTO java_master (name, description) VALUES (nam, descrip); 

     SET ind = (SELECT id FROM java_master WHERE name = nam AND description = descrip); 

     INSERT INTO java_package (master_id, parent_package_id, library_id) VALUES (ind, pack_id, lib_id); 
     IF `_rollback` THEN 
     ROLLBACK; 
     ELSE 
     COMMIT; 
    END IF; 
    END // 
DELIMITER ; 

мне нужно сделать этот набор заявление в середине получить и вернуть id в java_master таблице, даже если описание нулевое значение. .. какие-либо предложения относительно того, как я могу это сделать?

ответ

1

Поскольку вы не задаете значение для столбца «id», я собираюсь предположить, что ваш идентификатор является автоматически увеличивающимся значением.

- Как я представляю, как выглядит ваш стол? SHOW CREATE TABLE java_master;

CREATE TABLE java_master (id INTEGER PRIMARY KEY AUTO_INCREMENT, name CHAR(10), description VARCHAR(200)); 

- Пример вставки нулевой

INSERT INTO java_master(name, description) 
VALUES("class", NULL); 

- Если это так, то вы должны использовать LAST_INSERT_ID(), чтобы получить последнюю созданную стоимость авто Инкрементирование для таблицы. SET ind.

SELECT LAST_INSERT_ID(); 

Если вы настаиваете делать это, как вы его, то я должен вы могли бы сделать это:

SELECT id FROM java_master WHERE name = nam AND IFNULL(description, "") = IFNULL(descrip, ""); 

http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id

+0

Я нисколько не настаиваю на том, чтобы делать это по-своему ... LAST_INSERT_ID() - это SOOO намного проще и более fool_proof! большое спасибо! – Totalllyrandomguy

0

Используя ответ предоставленный Voidmain, решение моей проблемы не имеет отношения к следующему коду ...

DELIMITER // 
CREATE PROCEDURE add_package(nam VARCHAR(255), pack_id INT, lib_id INT, descrip TEXT) 
    BEGIN 
    DECLARE `_rollback` BOOL DEFAULT 0; 
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1; 
    START TRANSACTION; 
     INSERT INTO java_master (name, description) VALUES (nam, descrip); 
     INSERT INTO java_package (master_id, parent_package_id, library_id) VALUES ((SELECT LAST_INSERT_ID()), pack_id, lib_id); 
     IF `_rollback` THEN 
     ROLLBACK; 
     ELSE 
     COMMIT; 
    END IF; 
    END // 
DELIMITER ; 
Смежные вопросы