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 語句時,注意;的使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章