在MySQL存儲過程中使用SELECT …INTO語句爲變量賦值:用來將查詢返回的一行的各個列值保存到局部變量中。
要求:
查詢的結果集中只能有1行。
SELECT col_name[,...] INTO var_name[,...] table_expr
使用SELECT …INTO語句在數據庫中進行查詢,並將得到的結果賦值給變量。
①col_name:要從數據庫中查詢的列字段名;
②var_name:變量名,列字段名按照在列清單和變量清單中的位置對應,將查詢得到的值賦給對應位置的變量;
③table_expr:SELECT語句中的其餘部分,包括可選的FROM子句和WHERE子句。
1、單一變量賦值
例1:創建過程,得到指定球員的所有罰款總額
mysql> delimiter $$
mysql> create procedure total_penalties_player(
-> in p_playerno int,
-> out total_penalties dec(8,2))
-> begin
-> select sum(amount)
-> into total_penalties
-> from PENALTIES
-> where playerno=p_playerno;
-> end $$
mysql> delimiter ;
mysql> call total_penalties_player(27,@total);
mysql> select @total;
+--------+
| @total |
+--------+
| 175.00 |
+--------+
2、多變量賦值
例2:創建過程,得到一個給定球員的地址
mysql> DELIMITER $$ mysql> CREATE PROCEDURE get_address( -> IN p_playerno SMALLINT, -> OUT p_street VARCHAR(30), -> OUT p_houseno VARCHAR(4), -> OUT p_town VARCHAR(30), -> OUT p_postcode VARCHAR(6)) -> BEGIN -> SELECT street, houseno, town, postcode -> INTO p_street, p_houseno, p_town, p_postcode -> FROM PLAYERS -> WHERE playerno = p_playerno; -> END$$ mysql> DELIMITER ; mysql> call get_address(27,@s,@h,@t,@p); mysql> select @s,@h,@t,@p; +------------+------+--------+--------+ | @s | @h | @t | @p | +------------+------+--------+--------+ | Long Drive | 804 | Eltham | 8457DK | +------------+------+--------+--------+
注意:
在使用SELECT …INTO語句時,變量名和數據表中的字段名不能相同,否則會出錯。
3、拓展:select into outfile 用法、load data infile 用法
mysql> create table test_1(id int auto_increment primary key not null,name varchar(20) not null);
Query OK, 0 rows affected (0.21 sec)
mysql> insert into test_1(name) values('zhangsan'),('lisi');
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from test_1;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
+----+----------+
2 rows in set (0.01 sec)
mysql> select * into outfile '/tmp/result.txt'
-> fields terminated by ',' optionally enclosed by '"'
-> lines terminated by '\n'
-> from test_1;
Query OK, 2 rows affected (0.05 sec)
mysql> create table test_2 like test_1; #建test_2複製test_1表結構
Query OK, 0 rows affected (0.18 sec)
mysql> load data infile '/tmp/result.txt' into table test_2;
ERROR 1265 (01000): Data truncated for column 'id' at row 1
mysql> load data infile '/tmp/result.txt' into table test_2
-> fields terminated by ',' optionally enclosed by '"'
-> lines terminated by '\n';
Query OK, 2 rows affected (0.01 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from test_2;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
+----+----------+
2 rows in set (0.00 sec)
注意:
如果導出時用到了FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'語句,那麼LODA時也要加上同樣的分隔限制語句。還要注意編碼問題。
@author:http://www.cnblogs.com/geaozhang/