2014-10-03 117 views
0

我对MySQL(和一般数据库)非常陌生,并且已经负责制作一个存储过程,该存储过程将接受varchar作为参数,用作关键字从2列表。MySQL存储过程语法错误

我对语法并不熟悉,并且搜索互联网并没有像所希望的那样果断。这是我想出的:

DELIMITER // 

DROP PROCEDURE IF EXISTS proc_Search 
CREATE PROCEDURE proc_Search (IN word varchar(100)) 
BEGIN 
SELECT Section.Name 
FROM Section inner join DetailsMats ON Section.NumSection=DetailsMats.NumSection 
WHERE DetailsMats.TechName or DetailsMats.GenName LIKE %word%; 
END// 

只是想知道如果我在这里做一些令人讨厌的错误,或者如果我在正确的道路上。谢谢!

回答

0

我看到你的代码的两个错误:

  1. 缺少分隔符//DROP PROCEDURE ...
  2. LIKE表达式必须通过字符串。我用CONCAT('%', word, '%')得到字符串word'%'

更正代码:

DELIMITER // 

DROP PROCEDURE IF EXISTS proc_Search // -- delimiter here 

CREATE PROCEDURE proc_Search (IN word varchar(100)) 
BEGIN 
SELECT Section.Name 
FROM Section inner join DetailsMats ON Section.NumSection=DetailsMats.NumSection 
WHERE DetailsMats.TechName or DetailsMats.GenName LIKE CONCAT('%', word, '%'); 
END 
// 
0

似乎应该是这样的:

SELECT * 
FROM MyTable 
WHERE (Column1 LIKE '%keyword1%' OR Column2 LIKE '%keyword1%') 
     AND (Column1 LIKE '%keyword2%' OR Column2 LIKE '%keyword2%'); 
0

尝试使用CONCAT逃脱%字符。 快乐编码:)

DROP PROCEDURE IF EXISTS proc_Search CREATE PROCEDURE proc_Search (IN word varchar(100)) BEGIN SET @sql = CONCAT('SELECT Section.Name FROM Section inner join DetailsMats ON Section.NumSection=DetailsMats.NumSection WHERE DetailsMats.TechName or DetailsMats.GenName LIKE "',job_no, '%"'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END $$