0

私は次の機能を持っています:

DROP FUNCTION IF EXISTS saveTableRow;
DELIMITER $$
CREATE FUNCTION saveTableRow(adapter_id int(10), view_id int(10),name varchar(255)) RETURNS TINYINT(1)
BEGIN
    DECLARE retOK TINYINT DEFAULT 0;
    IF (SELECT COUNT(*) FROM `tables` WHERE `adapter_id`=adapter_id AND `view_id`=view_id AND `name`=name ) = 0 THEN
        INSERT INTO `tables` (`adapter_id`,`view_id`,`name`) VALUES (adapter_id, view_id, name);
        SET retOK = 1;
    END IF;
    RETURN retOK;
END;
$$
DELIMITER ;

関数を呼び出して新しい行を挿入すると

SELECT saveTableRow(3,1,'Text');

結果 '0' が返され、新しい行は保存されません。

4

2 に答える 2

0

名前衝突の問題かもしれません。列の名前は、パラメーターの名前と同じです。列の名前とは異なるパラメーターの名前を変更する必要があります。例えば、

DROP FUNCTION IF EXISTS saveTableRow;
DELIMITER $$
CREATE FUNCTION saveTableRow(
       _adapter_id int(10), 
       _view_id int(10),
       _name varchar(255)) 
RETURNS TINYINT(1)
BEGIN
    DECLARE retOK TINYINT DEFAULT 0;
    IF (SELECT COUNT(*) 
        FROM `tables` 
         WHERE `adapter_id`=_adapter_id AND 
               `view_id`=_view_id AND
               `name`=_name ) = 0 THEN
        INSERT INTO `tables` (`adapter_id`,`view_id`,`name`) 
        VALUES (_adapter_id, _view_id, _name);
        SET retOK = 1;
    END IF;
    RETURN retOK;
END;
$$
DELIMITER ;
于 2013-09-20T12:38:00.377 に答える
0

if を次のように変更してください:

IF ((SELECT COUNT(*) FROM `tables` WHERE `adapter_id`=adapter_id AND `view_id`=view_id AND `name`=name ) < 1)
于 2013-09-20T12:39:40.440 に答える