2016-06-10 121 views
1

我要沿着這條線執行代碼值分配給一個變量如何使用執行語句

select @a := id from B limit @i ,1 

但是MySQL不允許一個變量在極限中傳遞,因此我嘗試過其他兩件事情

select @proc := concat('select @a := id from B limit ', @i, ',1'); 
prepare stmt from @proc; 
execute stmt; 

這給出了一個錯誤,一樣

select @proc := concat(' id from B limit ', @i, ',1'); 
prepare stmt from @proc; 
select @a := execute stmt; 

請注意,我沒有之前的任何地方申報@a,但我失去的此時並不知道如何繼續。

+0

您使用的是哪個版本的MySQL? – wchiquito

+0

這是mariaDB 10.0.2 – avz2611

回答

1

嘗試:

MariaDB [_]> SET @`a` := NULL, 
    ->   @`proc` := CONCAT('SELECT @`a` := `B`.`id` 
    '>        FROM `B` 
    '>        LIMIT ', IFNULL(@`i`, 0), ', 1 
    '>        '); 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> PREPARE `stmt` FROM @`proc`; 
Query OK, 0 rows affected (0.00 sec) 
Statement prepared 

MariaDB [_]> EXECUTE `stmt`; 
+------------------+ 
| @`a` := `B`.`id` | 
+------------------+ 
|    10 | 
+------------------+ 
1 row in set (0.00 sec) 

MariaDB [_]> DEALLOCATE PREPARE `stmt`; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> SELECT @`a`; 
+------+ 
| @`a` | 
+------+ 
| 10 | 
+------+ 
1 row in set (0.00 sec) 

UPDATE

不使用CONCAT功能的另一種選擇。

MariaDB [_]> SET @`a` := NULL, 
    ->   @`i` := IFNULL(@`i`, 0); 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> PREPARE `stmt` FROM 'SELECT @`a` := `B`.`id` 
    '>       FROM `B` 
    '>       LIMIT ?, 1 
    '>       '; 
Query OK, 0 rows affected (0.00 sec) 
Statement prepared 

MariaDB [_]> EXECUTE `stmt` USING @`i`; 
+------------------+ 
| @`a` := `B`.`id` | 
+------------------+ 
|    10 | 
+------------------+ 
1 row in set (0.00 sec) 

MariaDB [_]> DEALLOCATE PREPARE `stmt`; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> SELECT @`a`; 
+------+ 
| @`a` | 
+------+ 
| 10 | 
+------+ 
1 row in set (0.00 sec) 
+0

ifnull語句的目的是什麼? – avz2611

+0

順便說一句,你使用'''的想法工作,所以我接受了答案,但你能解釋爲什麼你使用IFNULL – avz2611

+0

@ avz2611:[IFNULL](https://mariadb.com/kb/en/mariadb/ifnull/)如果它是NULL,則爲變量'@ \'i''分配一個默認值。 – wchiquito