0

我有这个程序:

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 ;

我需要在中间设置那个 set 语句,即使描述是空值,也可以idjava_master表中返回...关于如何做到这一点的任何建议?

4

2 回答 2

1

由于您没有为“id”列提供值,我将假设您的 id 是一个自动递增的值。

-- 我想你的桌子是什么样子的?显示创建表 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() 来获取表的最后创建的自动递增值。设置 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

于 2015-02-17T22:13:27.570 回答
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 ;
于 2015-02-17T22:46:16.647 回答