mysql中为什么调用这个存储过程会报错

nightgoblin 2012-03-21 05:32:02
我写了个存储过程,作用是将数据插入到a表中,请看源代码:

DROP TABLE IF EXISTS a;
DROP TABLE IF EXISTS b;
-- 创建b表
CREATE TABLE b
(b1 INT NOT NULL,
b2 BIGINT(20),
b3 VARCHAR(50),
CONSTRAINT PRIMARY KEY (b1)
);
-- 插入b表数据
INSERT INTO b VALUES (1001,201303,'b1');
INSERT INTO b VALUES (1002,201403,'b2');
INSERT INTO b VALUES (1003,201503,'b3');
INSERT INTO b VALUES (1004,201603,'b3');
INSERT INTO b VALUES (1005,201703,'b3');
INSERT INTO b VALUES (1006,201803,'b3');
-- 创建a表
CREATE TABLE a
(a1 INT NOT NULL,
a2 VARCHAR(50),
a3 BIGINT(20),
b1 INT,
CONSTRAINT PRIMARY KEY(a1),
CONSTRAINT fk_b1 FOREIGN KEY (b1) REFERENCES b (b1)
);
-- 插入a表数据
INSERT INTO a VALUES (1,'SB01',20130301,1001);
INSERT INTO a VALUES (2,'SB02',20140302,1002);
INSERT INTO a VALUES (3,'SB03',20150303,1003);
-- 创建存储过程
CREATE PROCEDURE spInsa
(v_a1 INT,
v_a2 VARCHAR(50),
v_b1 INT
)
BEGIN
DECLARE v_b2 BIGINT(20);
DECLARE v_a3 BIGINT(20);
SELECT b2 INTO v_b2 FROM b WHERE b1=v_b1;
SET v_a3=CONCAT(v_b2,(v_a2+0));-- a3的数据是b2的数据和a2数据中数字部分联合组成的
INSERT INTO a VALUES
(v_a1,
v_a2,
v_a3,
v_b1
);
END;

然后调用这个存储过程时报错:

CALL spInsa(4,'SB04',1004);

[Err] 1292 - Truncated incorrect DOUBLE value: 'SB04'

不知道错在哪里,请高手们帮忙看看。
...全文
179 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
nightgoblin 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wolfwu_kg5 的回复:]

试试set v_a3=concat(v_b2,substring(v_a2,3,2));
SQL code

mysql> create procedure spInsa(v_a1 int,v_a2 varchar(50),v_b1 int)
-> begin
-> declare v_b2 bigint(20);
-> declare v_a3 bigint(20)……
[/Quote]
感谢你回答
wolfwu_kg5 2012-03-22
  • 打赏
  • 举报
回复
试试set v_a3=concat(v_b2,substring(v_a2,3,2));

mysql> create procedure spInsa(v_a1 int,v_a2 varchar(50),v_b1 int)
-> begin
-> declare v_b2 bigint(20);
-> declare v_a3 bigint(20);
-> select b2 into v_b2 from b where b1=v_b1;
-> set v_a3 = concat(v_b2,substring(v_a2,3,2));
-> insert into a values (v_a1,v_a2,v_a3,v_b1);
-> end //
Query OK, 0 rows affected (0.00 sec)

mysql> call spInsa(4,'SB04',1004)//
Query OK, 1 row affected (0.03 sec)

mysql> select * from a where a1 =4 //
+----+------+----------+------+
| a1 | a2 | a3 | b1 |
+----+------+----------+------+
| 4 | SB04 | 20160304 | 1004 |
+----+------+----------+------+
1 row in set (0.00 sec)
nightgoblin 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 acmain_chm 的回复:]

SET v_a3=CONCAT(v_b2,right(v_a2,2));
[/Quote]
按你的方法试了,却报错:
[Err] 1630 - FUNCTION test.RIGHT does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual
ACMAIN_CHM 2012-03-21
  • 打赏
  • 举报
回复
SET v_a3=CONCAT(v_b2,right(v_a2,2));
nightgoblin 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acmain_chm 的回复:]

SET v_a3=CONCAT(v_b2,(v_a2+0));

'SB04' + 0 ,你想得到什么结果呢? 字符串与0相加。
[/Quote]
a表中a3是b表中b2列和a2列中数字部分组成的,也就是说‘SB04'只取‘04’,然后和b2=201603组成v_a3=20160304。
ACMAIN_CHM 2012-03-21
  • 打赏
  • 举报
回复
SET v_a3=CONCAT(v_b2,(v_a2+0));

'SB04' + 0 ,你想得到什么结果呢? 字符串与0相加。

56,682

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧