2014-09-02 70 views
0

聲明我在MySQL的是例如此創建SQL查詢的存儲過程:MySQL的:從文本變量準備不起作用

select 
a.street, 
a.bild, 
a.korp, 
a.flat, 
a.serial_num, 
nlog.value 
from( 
    select 
    cli.street, 
    cli.bild, 
    cli.korp, 
    cli.flat, 
    dev.serial_num, 
    mlog.value, 
    max(mlog.id) as $max_id 
    from mbus_clients as cli 
    join mbus_devices as dev 
    on dev.id_client=cli.id 
    join mbus_log as mlog 
    on mlog.serial_num=dev.serial_num 
    where street like CONCAT($in_street,'%') 
AND bild=1 AND korp='t' AND flat=1 
)as a 
join mbus_log as nlog 
on a.$max_id = nlog.id; 

此查詢工作正常,並存儲在$query變量,它的類型是:文本(65535)。 當我嘗試PREPARE stmnt1 FROM 'SELECT'這工作正常,但是當我嘗試PREPARE stmnt1 FROM $query mysql說有關語法上的一些錯誤。問題是什麼?

DROP PROCEDURE IF EXISTS `mbusGetClientsByStreet`;; 
    CREATE DEFINER = 'root'@'chl.rontel.ru' PROCEDURE `mbusGetClientsByStreet`(
     $in_street char(50), 
     $in_amount int(11), 
     $in_bild int(11), 
     $in_korp char(1), 
     $in_flat int(11) 
     ) 
     NOT DETERMINISTIC 
     CONTAINS SQL 
     SQL SECURITY DEFINER 
     COMMENT '' 
    begin 
    /*Скопин C.С. 01.09.2014 
    получение списка клиентов по части названия улицы и полного адреса*/ 
     declare $query text(65535); 
     set $query =" 
     select 
     a.street, 
     a.bild, 
     a.korp, 
     a.flat, 
     a.serial_num, 
     nlog.value 
     from( 
      select 
      cli.street, 
      cli.bild, 
      cli.korp, 
      cli.flat, 
      dev.serial_num, 
      mlog.value, 
      max(mlog.id) as $max_id 
      from mbus_clients as cli 
      join mbus_devices as dev 
      on dev.id_client=cli.id 
      join mbus_log as mlog 
      on mlog.serial_num=dev.serial_num 
      where street like CONCAT($in_street,\'%\') 
     "; 
     if $in_bild is NOT NULL THEN 

     SET $query = CONCAT($query,' AND bild=',$in_bild); 
      if $in_korp is NOT NULL THEN 

       set $query = CONCAT($query,' AND korp=\'',$in_korp,'\''); 

      end if; 
      if $in_flat is NOT NULL THEN 
       set $query = CONCAT($query,' AND flat=',$in_flat); 
      end if; 
     end if; 
     set $query=CONCAT($query,' 
     )as a 
     join mbus_log as nlog 
     on a.$max_id = nlog.id; 
     '); 
PREPARE stmt1 FROM $query; 
     SELECT $query; 
    end; 
+0

您是否逃過了引號? – 2014-09-02 11:24:04

+0

這是什麼意思?你能發佈錯誤嗎?另請嘗試@query。 – 2014-09-02 11:28:25

+0

我已經添加了過程文本。那麼我逃脫了。還有什麼不對嗎? – 2014-09-02 11:28:43

回答

0

我的猜測是變量沒有你期望的值。例如,如果變量未定義,那麼您的查詢中將有空位置。例如:

on a. = nlog.id; 

而這會產生一個錯誤。

或者,你可能有一個值,如「最大ID」,並有:

on a.max id = nlog.id 

我建議你明確地把值在SQL字符串,然後打印出變量替換後的字符串。這應該使錯誤更清楚。