Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建灵活的MySQL搜索过程?_Mysql - Fatal编程技术网

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

如何创建灵活的MySQL搜索过程?,mysql,Mysql,你好,亲爱的社区 已编辑 这是我的解决方案,基于答案。我稍微修改了procedure参数,还修复了一些%问题 DELIMITER $$ DROP PROCEDURE IF EXISTS `cosmedicdb`.`proc_searchall` $$ CREATE PROCEDURE `cosmedicdb`.`proc_searchall` (output TEXT, tbl varchar(50), kolom_kriteria VARCHAR(20),

你好,亲爱的社区

已编辑

这是我的解决方案,基于答案。我稍微修改了procedure参数,还修复了一些
%
问题

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 ;
我认为可以对其进行增强,以支持数值字段的搜索

下面的原始问题

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

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 ;
您可以看到,此过程仅适用于要搜索的特定列。是否可以(且安全)创建一个搜索过程,允许我使用任何列作为定义搜索条件进行搜索

谢谢

您可以使用:构建查询并执行它,例如-

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”字段;如果需要,可以添加它。

哦,我只知道我们可以在存储过程中构建查询/准备语句。让我来测试一下。但是,我已经接受你的答案作为默认答案。谢谢我编辑我的问题,以显示您的答案,并修改了过程参数。但是使用这种类型的过程,需要将应用程序代码硬连接到表名。不知怎的,我不喜欢……:)为什么在将查询发送到数据库之前不构建查询字符串?你能举例说明你想如何使用它,以及你的更多需求吗?你好@GustavBertram,是的,我确实知道这个窍门。以前我是这样工作的:构建sql字符串,然后将其发送执行。但是,目前我重写了一个现有的vb.net+mysql应用程序,它严重依赖于使用mysql存储过程。我很高兴知道复杂性可以分为数据库服务器一般来说,存储过程是个坏主意。它们很难调试,不可移植,而且在大多数情况下,它们不会给性能带来很大提升。我的建议是,你把它们扔掉,不管它们在哪里,它们都不重要。对于上面这样的查询,更好的(可读性更好、可维护性更好、可调试性更好)方法是构建字符串。但是,目前,我喜欢将所有与数据相关的代码移到数据库中的想法。无论如何,它是一个以数据为中心的应用程序。我可以将创建存储过程的工作与数据库工程师自己的工作分开。这样一来,作为程序员,我的工作量就大了。