存儲過程中SELECT INTO的使用

在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/

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章