mysql创建存储过程

-- use d_youmitest; 将会把d_youmitest;作为整个数据库名称,空格+; 所以书写时注意习惯
use d_youmitest
--下面这行是个坑,而且不能带“;”,否则将“//;”作为整体;如果不加此--行,看到的效果是 declare 那几行的都将标识为红色包含错误。
DELIMITER //
create procedure sp_bind_card(
p_cellphone varchar(16),
p_name varchar(100),
p_id_card varchar(50),
p_bank_card_no varchar(50),
p_channel_name varchar(100),
p_bank_abbr varchar(16),
out p_returnVal varchar(50)
)
begin
    declare user_id ,channel_account_id,bank_channel_info_id,account_id,channel_id bigint ;

    -- 如sql异常,回滚事务并设置返回失败
    DECLARE EXIT HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND begin ROLLBACK; set p_returnVal='fail'; end;

    -- disable autocommit
    set autocommit=0;

    -- get user_id
    select c_user_id into user_id from t_user where c_cellphone =p_cellphone;

    -- get channel_id and bank_channel_info_id;注意多字段时into的用法
    select t1.c_bank_channel_info_id ,t1.c_channel_id into bank_channel_info_id, channel_id
    from t_bank_channel_info t1 join t_channel t2 on t1.c_channel_id=t2.c_channel_id
    where t1.c_abbr=p_bank_abbr and t2.c_name=p_channel_name;

    # begin trans
    start transaction;
        update t_user set c_name=p_name,c_card_id=p_id_card where c_user_id=user_id;

        insert into t_account (c_user_id,c_bank_channel_info_id,c_bankcard_no,c_status,c_security_level)
                values(user_id,bank_channel_info_id,p_bank_card_no,1,1);

        select @@identity into account_id;

        insert into t_channel_account(c_account_id,c_channel_id,c_is_active)values(account_id,channel_id,0);

        commit;

        set p_returnVal='success';

end;//

DELIMITER ;

1、delimiter使用:在 程序被定义的时候,用mysql客户端delimiter命令来把语句定界符从 “;”变为“//”。这就允许用在 程序体中的“;”定界符被传递到服务器而不是被mysql自己来解释。

2、方案二:将以上脚本放入到文件中,然后使用source 命令创建,eg:放到 vi data/testsql.sql文件中,在mysql命令行下输入
source /home/kuoren/data/test.sql。注意最后两行 ,尤其“//”的位置

备注:source 的缩写“.” ,则 source /home/kuoren/data/test.sql 等价 . /home/kuoren/data/test.sql

3、mysql变量:@@标示系统变量 如 @@identity;
@标示用户自定义全局变量;
declare varName varType default defaultValue 定义当前块变量。

4 ID自增设置,设置ID为 AUTO_INCREMENT;同时指定AUTO_INCREMENT=1.当在新增行时,虽然设置了AUTO_INCREMENT=1,但仍然不是从1开始增长,主要是由于在mysql中自增变量是位于内存中的,即便把表删除,其仍然不会恢复到1开始增长,eg :现在表A有三条记录,ID为3,Drop table 表A后,创建表A在新增记录,会从4增长,重启mysql服务也会遇到ID重复问题,就由此导致.

5、写连续mysql 语句时,注意;的使用

上一篇:SystemImager自动化安装Linux系统(上)


下一篇:SQL 基础之索引、闪回、临时表(十八)