如何创建灵活的MySQL搜索程序?

时间:2011-11-21 04:35:48

标签: mysql

Hello dearest community,

EDITED

这是我的解决方案,基于Devart回答。我稍微修改了过程参数,并修复了一些%事物..

DELIMITER $$

DROP PROCEDURE IF EXISTS `cosmedicdb`.`proc_searchall` $$
CREATE PROCEDURE `cosmedicdb`.`proc_searchall` (output TEXT, tbl varchar(50), kolom_kriteria VARCHAR(20),
                                               kolom_nilai VARCHAR(20))
BEGIN

  SET @query = CONCAT('SELECT ', output, ' FROM ',tbl,' WHERE ', kolom_kriteria, ' LIKE CONCAT(','\'%',kolom_nilai, '%\')');
  PREPARE stmt FROM @query;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

END $$

DELIMITER ;

我认为可以增强此功能以支持数值字段的搜索

下面的原始问题

首先,我希望这不是一个转贴问题。 我想创建一个灵活的搜索过程。也就是说,可以从参数本身提供列ad和要搜索的列的值。目前这是我的搜索程序:

DELIMITER $$

DROP PROCEDURE IF EXISTS `cosmedicdb`.`proc_searchtindakan` $$
CREATE PROCEDURE `cosmedicdb`.`proc_searchtindakan` (kolom VARCHAR(20),
                                               kolomnilai VARCHAR(20))

BEGIN
 CASE kolom
 WHEN 'jenis'
         THEN
          SELECT jenis, harga
             FROM cosmedicdb.tb_mastertindakan
          where jenis like concat('%',kolomnilai,'%');
 END CASE;
END $$

DELIMITER ;

您可以看到此过程仅适用于某些要搜索的列。是否可以(并且安全)创建一个允许我使用任何列作为定义搜索条件进行搜索的搜索过程?

由于

1 个答案:

答案 0 :(得分:2)

您可以使用prepared statements执行此操作:构建查询并执行它,例如 -

DELIMITER $$

CREATE PROCEDURE proc_searchtindakan(IN kolom VARCHAR(20), IN kolomnilai VARCHAR(20))
BEGIN
  SET @query = CONCAT('SELECT ', kolom, 'FROM cosmedicdb.tb_mastertindakan WHERE ', kolom, ' LIKE CONCAT(\'%\'', kolomnilai, '\'%\'');
  PREPARE stmt FROM @query;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END
$$

DELIMITER ;

...在示例中,我已从字段列表中删除了'harga'字段;如果需要,可以添加它。