mysql5.0版本,我在MySQL Query工具中创建一个简单sp做测试,如下
create procedure sp_test()
begin
declare a int;
declare b int;end;
这么简单,既然说我的语法错误,不过我参照mysql5.0的手册写的呀,不明白,请问,刚才的语法如何?
还有,如何将SQL值给一变量(select expression into parameter from table)
如何定义变量,如何创建事物语法,谢谢

解决方案 »

  1.   


    DELIMITER $$;DROP PROCEDURE IF EXISTS  RJ_ATTACHCLEAR$$CREATE PROCEDURE RJ_ATTACHCLEAR(OUT RESULT INTEGER)
    BEGINDECLARE DAYS        INT;SELECT DAYS =CAST(ltrim(rtrim(Value)) AS DEC(5)) from CONFIG where Name='CLEAR';IF (DAYS IS NULL) THEN 
      SET DAYS=90;
    END IF;delete from TRANSFILE_BAK where DATEDIFF(NOW(),HANDLEDATE)>DAYS;END$$DELIMITER ;$$
    在SQLyog中执行
      

  2.   

    还有,当我返回值有中文时,为什么提示data too long?
      

  3.   

    DELIMITER $$DROP PROCEDURE IF EXISTS `mytravel_dbo`.`sp_test` $$
    CREATE PROCEDURE `sp_test`(in fi_t2 varchar(30))
    BEGIN
    declare f_incr_id integer;
    declare f_sys_cd varchar(10);
    declare f_sys_name varchar(500);    set f_incr_id = 0;    start transaction;
        insert into test(t2, t3, t4) values(fi_t2,current_timestamp(),0);
        set f_incr_id = (select last_insert_id());
        select sys_cd, sys_name into f_sys_cd, f_sys_name from sys_system where sys_cd = 'TAS';    update test set t4 = 12 where t1 = f_incr_id;    select f_sys_cd sys_cd, f_sys_name sys_name;
        commit;END $$DELIMITER ;
    返回的f_sys_name中是中文,2个字,但我执行这个procedure是提示data too log
      

  4.   

    1、检查fi_t2传入时的编码!
    2、检查fi_t2 是否真的DATA TOO LONG.
      

  5.   

    出现data too long不是fi_t2的问题,我测试时,fi_t2传入是test,数据可以插入到mysql,是update后,我查询那里出错了,sql如下:
    select sys_cd, sys_name into f_sys_cd, f_sys_name from sys_system where sys_cd = 'TAS'; 
    然后select f_sys_cd sys_cd, f_sys_name sys_name; 输出这2个值,sys_cd是英文,sys_name是中文,
    错误就出在f_sys_name那,报错’data too long for column 'f_sys_name' at low 1
      

  6.   

    如果你确认你的SQL没有问题,数据没有问题,那么请下载一份最新的MYSQL,如果问题仍旧再来继续讨论。bugs.mysql.com 记得常去看 =)
      

  7.   

    真的噢,我将5.0升级到5.1.11就好了,还是在mysql query中执行相同的命令,就没有data too long的报错了,不过返回了?号,这个是什么问题?字符编码吗?不过我是在db中执行噢,也会有这个问题吗?而如果我用select sys_cd, sys_name into f_sys_cd, f_sys_name from sys_system where sys_cd = 'TAS'; 来直接查看该表有没有问题,怎么会这样?
      

  8.   

    1、存储过程建议采用如下写法:delimiter //
    create procedure sp_test() 
    begin 
    declare a int; 
    declare b int; end;delimiter ;2、还有,如何将SQL值给一变量:
    回复:
    decalre myintparas int; 
    select myIntColumn into myintparas from table limit 0,1
    (一定要保证只有一条数据,否则出错,多条的时候,使用游标)3、如何定义变量,如何创建事物语法
    回复:
    定义变量,你已经回了。
    事物:
    START TRANSACTION;
    SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
    UPDATE table2 SET summary=@A WHERE type=1;
    COMMIT;会了吗?
      

  9.   

    不好意思,最后看到你下面的问题:真的噢,我将5.0升级到5.1.11就好了,还是在mysql query中执行相同的命令,就没有data too long的报错了,不过返回了?号,这个是什么问题?字符编码吗?不过我是在db中执行噢,也会有这个问题吗?而如果我用select sys_cd, sys_name into f_sys_cd, f_sys_name from sys_system where sys_cd = 'TAS'; 来直接查看该表有没有问题,怎么会这样?是编码的问题,这是因为,你从外部程序中读数据时,程序接口要的与数据库传出来的数据格式是不一致造成的。
    建议在调用存储过程前执行如下语句:
    php程序执行(mysql_query ,mysqli_query 是PHP函数,其他程序也有类似的函数):
    mysql_query("SET NAMES 'utf8'",$link); // 你可以更改其他字符集,我使用的是 utf8
    或:
    mysqli_query("SET NAMES 'utf8'",$link); 问题即可解决。
      

  10.   

    补充:
    mysql_query("SET NAMES 'utf8'",$link); // 你可以更改其他字符集,我使用的是 utf8,也就是说,你的程序是用哪个字符集存储的,就用哪个,我的程序是utf8,不过,一般程序都是这个字符集,有些例外,你可以自己定义存储的字符集。