2016-02-29 76 views
0

I'm在执行此存储过程中的MySQL收到这个错误:MySQL错误:错误代码:1292截断不正确DOUBLE值

错误代码:1292截断不正确DOUBLE值:“WHERE s.name =”已确认'AND bp.id =''

DROP PROCEDURE IF EXISTS test; 
DELIMITER // 
CREATE PROCEDURE test (province VARCHAR(100), country VARCHAR(100), departureDate TIMESTAMP, arrivalDate TIMESTAMP, people INTEGER) 
BEGIN 
DECLARE selectClause VARCHAR(500) DEFAULT "SELECT DISTINCT b.id, b.boat_model_id, b.port_id, b.address_id, b.maximum_discount, 
       b.discounts_have_subtotals, b.skipper_type_id, b.length, b.people_capacity_id, 
       b.simple_cabin_id, b.double_cabin_id, b.bathroom_id, year_id ";   
DECLARE fromClause VARCHAR(500) DEFAULT "FROM states s, boat_people bp, boat_prices bprd, boat_prices bpra, boats b "; 
DECLARE whereClause VARCHAR(1000) DEFAULT "WHERE s.name = 'Confirmed' 
AND bp.id = " + people + " 
AND b.state_id = s.id 
AND b.id NOT IN (SELECT bc.boat_id 
        FROM boat_calendars bc 
        WHERE (date(bc.since) <= " + departureDate + " AND date(bc.until) >= " + departureDate + ") 
        OR (date(bc.since) <= " + arrivalDate + " AND date(bc.until) >= " + arrivalDate + ")) 
AND bprd.boat_id = b.id 
AND date(bprd.since) <= " + departureDate + " AND date(bprd.until) >= " + departureDate + " 
AND bpra.boat_id = b.id 
AND date(bpra.since) <= " + arrivalDate + " AND date(bpra.until) >= " + arrivalDate + " 
AND truncate(((bprd.weekly_price + bpra.weekly_price)/2), 2) > 0"; 
SET @queryClause = concat(selectClause, fromClause, whereClause); 
PREPARE stmt FROM @queryClause; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END // 
CALL test('Mallorca (Islas Baleares)', 'España', '2016-03-02 16:02:12', '2016-03-02 16:02:12', 1); 

Table boat_people.id is INT(11)。

+0

声明的人的规模,'人INTEGER(11)' – Mihai

+0

没有,仍然得到同样的错误。 – Rober

+0

并且如果您调用将引号添加到最后一个参数的过程? – Mihai

回答

0

你有什么具体原因为什么你“DECLARE”变量?你可以直接写“SELECT”查询。例如,

CREATE PROCEDURE `myprocedure`(myparam VARCHAR(100)) 
BEGIN 
    SELECT * from mytable where myfield = myparam; 
END 

CALL myprocedure('value'); 

编辑:基本上+不适用于字符串连接工作,

CREATE PROCEDURE `myprocedure`(myparam VARCHAR(100)) 
BEGIN 
    DECLARE queryClause VARCHAR(1000) DEFAULT CONCAT('select * from mytable where myfield = "', myparam, '"'); 
    SET @queryA = queryClause; 
    PREPARE stmt FROM @queryA; 
    EXECUTE stmt; 
END 

你不需要 “申报”。你可以使用SET如下:

SET @queryA = CONCAT('select * from mytable where myfield = "', myparam, '"'); 

组或多组如下:

SET @queryA = CONCAT('select * from mytable where myfield = "', myparam, '"'); 
SET @queryB = ' and myfield is not null '; 
SET @queryC = CONCAT(@queryA, @queryB); 
+0

是的,有一个具体原因。查询si是dinamically生成的,我的意思是,根据变量值,新的部分将包含在查询中。 – Rober

相关问题