使用输入和输出参数创建MySQL存储过程

时间:2014-06-03 18:19:20

标签: php mysql sql stored-procedures


回答https://stackoverflow.com/a/24034862/1173155


我正在测试一个存储过程如下:

DELIMITER $$
CREATE PROCEDURE `test1`(IN `tab_name` VARCHAR(40), IN `value_of` VARCHAR(40), OUT `the_id` INT(1))
BEGIN
 SET @t1=CONCAT('
    BEGIN 
        IF EXISTS (SELECT ',tab_name,'.id from ',tab_name,' where ',tab_name,'.',tab_name,' = ',value_of,')
            THEN
            select id into ',the_id,' from ',tab_name,' where ',tab_name,'.',tab_name,' = ',value_of,';
        ELSE 
            insert into ',tab_name,' values (NULL,',value_of,');
END IF;');
 PREPARE stmt3 FROM @t1;
 EXECUTE stmt3;
 DEALLOCATE PREPARE stmt3;
END $$
DELIMITER ;

尝试选择ID或插入。当我尝试按原样使用此过程时,表中有一行;它没有任何回报。

我想要的值的标识符是为了简单起见的表名。花了很多时间,我不知所措。

已经尝试了所有的东西,即使现在只是想添加NULL,也可以工作,因为表有两个值,我忘了把它放进去只是为了意识到我在第一个if子句中尝试它... IE,输入数据确保调用第一个语句

感谢您的帮助


更新

仍有问题。试着让它尽可能简单。

我有一张城市表,其中包含1条记录。结构就像这样city.city = 'Dublin'

值和表名相同。当通过phpMyAdmin

执行时,follow select语句有效
BEGIN
     SET @t1= CONCAT("

         SELECT id 
             FROM ",tab_name," 
                     WHERE ",tab_name," = '",value_of,"'


                     ");
     PREPARE stmt3 FROM @t1;
     EXECUTE stmt3;
     DEALLOCATE PREPARE stmt3;
END

现在我只需要确保如果select语句没有返回任何内容,则插入该值并返回select语句。

这似乎是一个简单的问题,但我无法在任何地方找到解决方案

-

INSERT IGNORE不好,因为无论插入多少,它都会增加ID。是否有解决方法,因为我可以使用它。

INSERT IGNORE ... //没有增量?

SELECT ^ ....


进一步更新

我的程序现在看起来像这样(需要两个VARCHAR参数),这当前正在工作。如果值已经存在,它就不会增加ID,这简直太棒了。

BEGIN
 SET @t1= CONCAT("INSERT INTO ",tab_name,"(",tab_name,")
SELECT '",city_name,"' FROM dual
 WHERE NOT EXISTS (SELECT 1 
    FROM ",tab_name," 
     WHERE ",tab_name," = '",city_name,"');
        ");
   PREPARE stmt3 FROM @t1;
     EXECUTE stmt3;
     DEALLOCATE PREPARE stmt3;
    END

我现在想要的只是一个简单的SELECT语句来返回具有该城市名称的行的id。例如SELECT id FROM tab_name WHERE tab_name = 'city_name';

但添加此内容会导致错误:(感谢任何人都有解决这个荒谬问题的方法

2 个答案:

答案 0 :(得分:0)

您撰写的声明不应返回结果。 select into和insert语句都不返回结果。

这是一个存储过程。

首先执行SELECT,然后使用insert进行操作。 select将是该过程的第一个输出结果集。

答案 1 :(得分:0)

通过phpMyAdmin工作的解决方案。还必须在PHP和PDO中进行测试,看看是否一切都很好。

CREATE PROCEDURE `select_insert`(IN `the_value` VARCHAR(150), IN `tab_name` VARCHAR(50))
BEGIN
 SET @t1= CONCAT("INSERT INTO ",tab_name,"(",tab_name,")
SELECT '",the_value,"' FROM dual
 WHERE NOT EXISTS (SELECT 1 
    FROM ",tab_name," 
     WHERE ",tab_name," = '",the_value,"');
        ");
   PREPARE stmt FROM @t1;
   EXECUTE stmt;
   DEALLOCATE PREPARE stmt;

     SET @t2 = CONCAT("SELECT id FROM ",tab_name," WHERE ",tab_name," = '",the_value,"'");
      PREPARE stmt1 FROM @t2;
   EXECUTE stmt1;
   DEALLOCATE PREPARE stmt1;
    END

这是插入或检索表中唯一值的通用过程。我试图解决这个问题时使用了一个城市的例子。

第一个预准备语句将提供的值插入到提供的表名中。如果没有插入,它不会增加自动增量值。

第二个预准备语句检索该值。由于第一个查询的性质,实际上不应该返回任何值。