首页新闻找找看学习计划

Mysql 一个简单的Mysql存储过程 的问题

0
[待解决问题]
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  根本就没赋值

怎么会这样啊
Inszt的主页 Inszt | 初学一级 | 园豆:151
提问于:2015-10-22 14:46
< >
分享
所有回答(2)
0

SELECT fullname FROM navi_issuer WHERE id = 3;这句查不到才会出现这种问题吧。

清海扬波 | 园豆:841 (小虾三级) | 2015-10-22 15:19

这个确定有值,单独查 有值 ,后来 我知道了

其实 我想查的是

SELECT i.fullname INTO uname FROM navi_issuer i  WHERE i.id = 1;

 

但是 用成了 参数的id,应该是 两个名称 重复了,传入的参数 id 确实 不等于3。。。。。

 

但我问一下,select 变量; 就算是 打印了吧,但是为什么我连着写了好几行,只有第一行 会打印出来,其他的不打印?

 

 

 

 

支持(0) 反对(0) Inszt | 园豆:151 (初学一级) | 2015-10-22 16:07

@Inszt: select 变量会查询出来 select 值 into 变量 这样不会查询出来,select 变量=值也不会查询出来。

支持(0) 反对(0) 清海扬波 | 园豆:841 (小虾三级) | 2015-10-23 09:26

@清海扬波: 

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,其余 就没了

支持(0) 反对(0) Inszt | 园豆:151 (初学一级) | 2015-10-23 17:02
1

为什么自己写一个存储过程就不去里面调试,存储过程就是一群sql语句的集合罢了

稳稳的河 | 园豆:4183 (老鸟四级) | 2015-10-22 15:51

我初学,这个还能调试?怎么调试?

我是直接用 工具写的,sqlyog或 navicat for Mysql

支持(0) 反对(0) Inszt | 园豆:151 (初学一级) | 2015-10-22 16:08

@Inszt: 你去执行sql语句,看下存储过程往下走的过程那里有问题,你难道一个存储过程是写完了再测试

支持(0) 反对(0) 稳稳的河 | 园豆:4183 (老鸟四级) | 2015-10-22 16:12

@稳稳的河: 这么个调试啊  sql语句 有问题 直接就报语法错误;即便不报,单独拿出来执行 也是没有问题的

 

只有 放进 存储过程中,整个逻辑下 才能看出哪里的问题。

比如我这个例子,没有参数上的重名的id,单独执行没错误。

支持(0) 反对(0) Inszt | 园豆:151 (初学一级) | 2015-10-22 16:19

@Inszt: 你的参数可以传进来的,你自己定义参数,整个过程都可以和你出错的一样,你这句拿出来执行就没问题,只要放进存储过程中,才能看出问题,我就不明白了,你一句一句往下面执行,查询出来的东西你觉的太多,一下看不出问题,先放临时表里面也行,我怀疑你现在还不知道sql语句也可以定义如DECLARE num INT(2) DEFAULT 100;临时表这些,还在认为这些只能在存储过程执行

支持(0) 反对(0) 稳稳的河 | 园豆:4183 (老鸟四级) | 2015-10-22 16:33

@稳稳的河: 还真不知道啊。。。sql语句中可以定义变量,那流程控制不会也可以吧?

如果 就我上边的例子 ,怎么才能 按你说的 自己 用sql  “模拟” 存储过程 调试呢? 伪代码也行

支持(0) 反对(0) Inszt | 园豆:151 (初学一级) | 2015-10-22 16:47

@Inszt: 其实你存储过程里面的都是sql语句

支持(0) 反对(0) 稳稳的河 | 园豆:4183 (老鸟四级) | 2015-10-22 16:57

@稳稳的河: 

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

支持(0) 反对(0) Inszt | 园豆:151 (初学一级) | 2015-10-23 16:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册