CREATE DEFINER=`root`@`localhost` PROCEDURE `syntax_if`(IN id INT,OUT u_name VARCHAR(20)) BEGIN DECLARE uname VARCHAR(20) DEFAULT '-NULL-'; DECLARE num INT(2) DEFAULT 100; #这是单行注释 /* 拼接字符串和打印 这是多行注释 */ SELECT fullname INTO uname FROM navi_issuer WHERE id = 3; #select uname; SET u_name = CONCAT(uname ,"TTT"); END$$ DELIMITER ;
创建完执行 有问题。
1 queries executed, 1 success, 0 errors, 1 warnings 查询:CALL syntax_if(1,@u_name_p) 共 0 行受到影响, 1 个警告 执行耗时 : 0 sec 传送时间 : 0.003 sec 总耗时 : 0.004 sec Warning Code : 1329 No data - zero rows fetched, selected, or processed
SELECT @u_name_p; #查询完的结果 也不对,直接是 -NULL-TTT 也就是说 select into 根本就没赋值 怎么会这样啊
SELECT fullname FROM navi_issuer WHERE id = 3;这句查不到才会出现这种问题吧。
这个确定有值,单独查 有值 ,后来 我知道了
其实 我想查的是
SELECT i.fullname INTO uname FROM navi_issuer i WHERE i.id = 1;
但是 用成了 参数的id,应该是 两个名称 重复了,传入的参数 id 确实 不等于3。。。。。
但我问一下,select 变量; 就算是 打印了吧,但是为什么我连着写了好几行,只有第一行 会打印出来,其他的不打印?
@Inszt: select 变量会查询出来 select 值 into 变量 这样不会查询出来,select 变量=值也不会查询出来。
@清海扬波:
DELIMITER $$ #USE `mytest`$$ DROP PROCEDURE IF EXISTS `test_select`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `test_select`(OUT s INT) BEGIN #SELECT COUNT(*) INTO s FROM navi_issuer; SET s = 1; SELECT s; SET s = 2; SELECT s; SET s = 888; SELECT s; SELECT s; END$$ DELIMITER ;
执行
CALL test_select(@s);
你可以看一下 ,直接 复制执行 就可以
结果 就是 只打印了 第一个1,其余 就没了
为什么自己写一个存储过程就不去里面调试,存储过程就是一群sql语句的集合罢了
我初学,这个还能调试?怎么调试?
我是直接用 工具写的,sqlyog或 navicat for Mysql
@Inszt: 你去执行sql语句,看下存储过程往下走的过程那里有问题,你难道一个存储过程是写完了再测试
@稳稳的河: 这么个调试啊 sql语句 有问题 直接就报语法错误;即便不报,单独拿出来执行 也是没有问题的
只有 放进 存储过程中,整个逻辑下 才能看出哪里的问题。
比如我这个例子,没有参数上的重名的id,单独执行没错误。
@Inszt: 你的参数可以传进来的,你自己定义参数,整个过程都可以和你出错的一样,你这句拿出来执行就没问题,只要放进存储过程中,才能看出问题,我就不明白了,你一句一句往下面执行,查询出来的东西你觉的太多,一下看不出问题,先放临时表里面也行,我怀疑你现在还不知道sql语句也可以定义如DECLARE num INT(2) DEFAULT 100;临时表这些,还在认为这些只能在存储过程执行
@稳稳的河: 还真不知道啊。。。sql语句中可以定义变量,那流程控制不会也可以吧?
如果 就我上边的例子 ,怎么才能 按你说的 自己 用sql “模拟” 存储过程 调试呢? 伪代码也行
@Inszt: 其实你存储过程里面的都是sql语句
@稳稳的河:
DECLARE num INT(2) DEFAULT 100;
这句 好像真不行,至少我在 工具里 执行 报错
<e>查询:DECLARE num INT(2) DEFAULT 100
错误代码: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE num INT(2) DEFAULT 100' at line 1