2014-03-13 155 views
0

我有一個存儲過程,即將其中一個變量設置爲NULL,儘管查詢返回結果。MySQL存儲過程變量返回NULL

這裏是SP:

 
    CREATE DEFINER=`xxx`@`localhost` PROCEDURE `test`(IN CLIENT_ID INT) 
    BEGIN 
     DECLARE BEGIN_RANGE INT UNSIGNED DEFAULT 0; 
     select client_id into @CLIENT_ID3 from clients where 
client_id = CLIENT_ID limit 1; 
     SET @BEGIN_RANGE = (select var_value from counter where var_name = 
'latest_report_id_summarized' limit 1); 

     SELECT latest_invoice_id into @LATEST_INVOICE_ID from 
SQL_AuditPro.clients where client_id = CLIENT_ID; 
    END 

當我運行的SP,然後選擇結果:

 
select @CLIENT_ID3,@BEGIN_RANGE,@LATEST_INVOICE_ID; 

我得到:

 
12345,2342342234,NULL 

我也曾嘗試:

 
CREATE DEFINER=`xxx`@`localhost` PROCEDURE `test`(IN CLIENT_ID INT) 
BEGIN 
    DECLARE BEGIN_RANGE INT UNSIGNED DEFAULT 0; 
    select client_id into @CLIENT_ID3 from clients 
where client_id = CLIENT_ID limit 1; 
    SET @BEGIN_RANGE = (select var_value from counter where var_name = 
'latest_report_id_summarized' limit 1); 

    SET @LATEST_INVOICE_ID = (SELECT latest_invoice_id from 
SQL_AuditPro.clients where client_id = CLIENT_ID); 
END 

同樣的結果。顯然,我不需要SET @ CLIENT_ID3它只是在那裏進行測試。任何想法爲什麼這不會設置變量?當我本身運行此查詢我得到的結果,如果我跑:

 
SELECT latest_invoice_id into @LATEST_INVOICE_ID from 
SQL_AuditPro.clients where client_id = 12345; 
select @LATEST_INVOICE_ID; 

我得到:

 
2342342234 

我曾嘗試聲明變量,沒有宣佈它,它只是看起來這個變量在SP完成後似乎超出了範圍,但其他兩個卻沒有。

感謝所有幫助您可以提供。

回答

0
select client_id into @CLIENT_ID3 from clients where client_id = CLIENT_ID limit 1; 
                   ^---- missing @ 

SET @LATEST_INVOICE_ID = (SELECT [..snip..] where client_id = CLIENT_ID); 
                   ^--missing @ as well 

正如所寫的,兩者都將被解釋爲自平等測試,例如, where 1 = 1。 mysql沒有辦法知道在=的任何一側上的client_id應該是你傳遞給存儲過程的參數,所以client_id都將被當作字段名。由於第二個查詢很可能會返回多行數據,並且您試圖將該結果分配到單個變量中,所以您會得到NULL作爲結果。

0

當您定義參數名稱以與一個或多個表列匹配時,那麼在您的SQL語句中,必須使用列限定符來區分參數名稱。否則,他們將被視爲並通過參數值進行替換;

參見SQL Fiddle Example

在你的情況,作爲所述條件client_id = CLIENT_ID是造成對(可能)取多個記錄,它們不能分配給非光標類型的變量。因此返回了NULL(用戶定義變量的默認值)。

如下更改過程體:

CREATE DEFINER=`xxx`@`localhost` PROCEDURE `test`(IN CLIENT_ID INT) 
BEGIN 
    DECLARE BEGIN_RANGE INT UNSIGNED DEFAULT 0; 
    select c.client_id into @CLIENT_ID3 
    from clients c 
    where c.client_id = CLIENT_ID limit 1; 

    SET @BEGIN_RANGE = 
     (select var_value 
      from counter 
      where var_name = 'latest_report_id_summarized' limit 1); 

    SET @LATEST_INVOICE_ID = 
     (SELECT c.latest_invoice_id 
      from SQL_AuditPro.clients c 
      where c.client_id = CLIENT_ID); 
END