存储过程中SELECT INTO的使用

摘要:
使用MySQL存储过程中的SELECT…INTO语句查询数据库并将结果分配给变量。1.单变量赋值示例1:在创建过程中,获取指定播放器mysql˃分隔符$$mysql˃createproceduretotal_penalties_player-˃begin-˃selectsum-˃intotal_penalties-˃fromPENALTIES-˃其中playerno=p_playerno;-˃end$$mysql˃分隔符;mysql˃calltotal_penalties_player;mysql˃select@total ;+--------+|@ 总计|+---------+|175.00|+---------+2.多变量赋值示例2:创建进程,获取给定玩家的地址mysql˃DELIMITER$$mysql˃CREATEPROCEDUREget_ address-˃BEGIN-˃SELECTstreet,houseno,town,邮政编码-˃INTOp_ street,p_houseno、p_town,p_postcode-˃FROMPLAYERS-˃WHEREplayerno=p_playerno;-˃结束$$mysql˃DELIMITER;mysql˃callget_address;mysql˃select@s,@h,@t,@p;+---------------+---------------+--------+--------+|@S|@h|@t|@p|+---------------+---------------+------------+|LongDrive|804|Eltham|8457DK|+------------+------------+---------------+--------+注意:使用SELECT时

在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 '
'
    -> from test_1;
Query OK, 2 rows affected (0.05 sec)

[root@mysqlserver tmp]# cat result.txt
1,"zhangsan"
2,"lisi"

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 ' '; 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 ' '语句,那么LODA时也要加上同样的分隔限制语句。还要注意编码问题。

免责声明:文章转载自《存储过程中SELECT INTO的使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解决ubuntu 20.04安装nvidia驱动后循环登录的问题关于JavaScriptInterface的一系列问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql三种删除方式

一般来说mysql有三种删除数据方式: 1. delete(常用) 2. truncate(慎用) 3. drop 以上三种方式都可以删除数据,但是使用场景是不同的。 从执行速度来说: drop > truncate >> DELETE 深入底层来说: 一、DELETE DELETE是属于数据库的DML操作语言,使用delete删除数据时...

Mysql 表转换成 Sqlite表

目前的转换仅仅支持对没有外键的Mysql数据表 准备: 下载安装 Sqlite Expert 软件 一 获取Mysql中的.sql文件,获取过程省略可以直接导出sql文件 二 在Sqlite Expert 中新建数据库 三 在数据库中选中sql Tab,导入之前准备sql文件 四 关键步骤     将创建表的最后关于编码的sql语句一句primary ke...

小米监控 open-falcon部署

具体详情请参考官方文档  http://book.open-falcon.org/zh_0_2/quick_install/    centos6.8    建议centos7系统  否则后面按照官方文档来是有很多问题的   需要解决Python依赖问题    Python2.7 版本以上,由于centos6.8  pyhton默认版本是 2.6 环境准备...

ORACLE日期函数

以时间2007-11-0213:45:25为例 日期字段 格式 英文 解释 显示值 Year yy twodigits 两位年 07 yyy threedigits 三位年 007 yyyy fourdigits 四位年 2007 Month mm...

docker在Ubuntu下1小时快速学习

前言 由于工作原因,很多情况下需要快速学习新的知识,针对docker如果从头到尾看相关书籍学习会非常慢,所以整理了下docker的常用操作,只要跟着本文学习操作,一小时就能掌握docker大部分最常用操作方法,也可以当做工具手册随时查找学习,当然本文未涉及的部分,还是需要通过阅读书籍学习,这文章的目的是帮助需要快速上手应用的人。由于写该文章的时候还比较早,...

Jmeter-连接mysql取值

转自:https://blog.csdn.net/weixin_42384941/article/details/105322371 1、下载数据库驱动(https://dev.mysql.com/downloads/connector/j/) Select Operating System: platform independent 注:驱动和数据库版本...