MySQL - 如何在过程中编写查询? (SET 数据类型参数)

Posted

技术标签:

【中文标题】MySQL - 如何在过程中编写查询? (SET 数据类型参数)【英文标题】:MySQL - How do I write a query in a procedure? (SET datatype parameter) 【发布时间】:2015-01-15 14:04:01 【问题描述】:

有几种方式传递参数也没有数据。 如何在过程中编写查询? (SET 数据类型参数)

CREATE TABLE tb (
   iCode INT(11) NOT NULL DEFAULT 0 COMMENT 'Primary Key'
 , bChk1 VARCHAR(1) NOT NULL DEFAULT 'Y' COMMENT '(Y, N)'
 , bChk2 SET('Y', 'N') DEFAULT 'Y' COMMENT '(Y, N)'
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE PROCEDURE getChk1 (
  IN inChk VARCHAR(10)
)
BEGIN
  SELECT * FROM tb WHERE bChk1 IN (inChk);
END;

CREATE PROCEDURE getChk2 (
  IN inChk SET('Y', 'N') 
)
BEGIN
  SELECT * FROM tb WHERE bChk2 IN (inChk);
END;


## Row Data
# ----------------------
# iCode | bChk1 | bChk2
# ----------------------
#   1   |   Y   |   Y
#   2   |   N   |   Y
#   3   |   Y   |   N
#   4   |   N   |   N
# ----------------------

执行程序...

CALL getChk2 ("'Y', 'N'");   -- No Data
CALL getChk2 ('"Y", "N"');   -- No Data
CALL getChk2 ('1, 2');       -- No Data
CALL getChk2 ("'1', '2'");   -- No Data
CALL getChk2 ("'Y'|'N'");    -- No Data
CALL getChk2 ('Y|N');        -- No Data
CALL getChk2 ("'1'|'2'");    -- No Data
CALL getChk2 ('1|2');        -- No Data

CALL getChk1 ("'Y', 'N'");   -- No Data
CALL getChk1 ('"Y", "N"');   -- No Data
CALL getChk1 ("'Y'|'N'");    -- No Data

如何在过程中编写查询? (SET 数据类型参数) 感谢阅读。

【问题讨论】:

尝试作为静态查询处理。动态查询不是 【参考方案1】:

Pass array to mysql stored routine

DROP PROCEDURE IF EXISTS getChk1;
DELIMITER //
CREATE PROCEDURE getChk1(IN inChk VARCHAR(10))
BEGIN
  SET @sql = CONCAT('SELECT * FROM tb WHERE bChk1 IN (', inChk, ')');
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END;
//
DELIMITER ;
CALL getChk1 ('\'Y\', \'N\'');

【讨论】:

【参考方案2】:

感谢回答的主。 尝试将查询解析为静态查询,而不是动态查询。

CREATE PROCEDURE getChk2 (
  IN inChk SET('Y', 'N') 
)
BEGIN
  SELECT * FROM tb WHERE FIND_IN_SET(bChk2, inChk);
END;
CALL getChk2 ('Y,N');

【讨论】:

以上是关于MySQL - 如何在过程中编写查询? (SET 数据类型参数)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CakePHP 中使用自定义 MySQL 查询?

MySQL设计;带有变量的视图或存储过程

MySQL存储过程中如何遍历查询结果然后调用另一个存储过程?

sql 视图 存储过程 的区别?

navicat for MySQL中的 查询编辑器中如何执行存储过程?

如何提高查询性能?