Golang MySQL儲存過程的使用

2021-07-12 07:17:17 字數 3070 閱讀 2361

ref-1:問題** [支付系統資料庫設計的關鍵問題 ]

ref-2:

[golang 用go-sql-driver 呼叫mysql儲存過程時的問題排查]

編輯檔案src/github.com/go-sql-driver/mysql/packets.go檔案,在函式writeauthpacket(cipher byte) (大約在210行)的客戶端標誌位處新增下面兩個標誌:

func (mc *mysqlconn) writeauthpacket(cipher byte) error
-- 單行執行以下語句

set names utf8;

-- dsp_settle資料庫

use dsp_settle;

drop procedure

ifexists

settle_balance_deduction;

-- [1]設定分隔符為//

delimiter //

--[2] 執行source /path/to/procedure.sql; !!! error

--[2]copy /path/to/procedure.sql

toconsole

andenter

--[3]還原分隔符

delimiter ;

--[4]呼叫示例

call settle_balance_deduction(5372539, 1234, 100, @out_status);

select @out_status;

-- 其他常用操作

-- 調研儲存過程

call procedure_name(parameters);

-- 查詢儲存過程

show procedure

status;

-- 顯示乙個儲存過程詳情

show create

procedure

procedure_name;

-- 刪除儲存過程

drop procedure

procedure_name;

儲存過程**

-- 建立儲存過程

create procedure settle_balance_deduction (in_userid bigint, in_planid int, in_money int, out out_status int )

begin

-- 變數 使用者實際餘額

declare account_balance int;

start transaction;

select balance into account_balance from dsp_settle.user_balance where userid = in_userid and status =0 and isdelete =0 for update;

if account_balance >= in_money then

-- 扣費操作

update user_balance set balance = balance - in_money, opuserid =1001 where userid = in_userid;

-- 扣費記錄

insert into dsp_settle.charge_record(userid, planid, charge, opuserid, addtime) values (in_userid, in_planid, in_money,1001, now());

-- 提交事務處理

commit;

-- 返回結果狀態1

set out_status =1;

else

-- 餘額小於扣費額,不操作

rollback;

-- 返回結果狀態0

set out_status =0;

end if;

end //

go呼叫儲存過程**,親測可用

)//扣費結算

func settle(userid int, planid int, charge int) int

defer db.close()

handle, err := db.prepare("call dsp_settle.settle_balance_deduction(?, ?, ?, @out_status)")

if err != nil

defer handle.close()

//call procedure

var result sql.result

result, err = handle.exec(userid, planid, charge)

if err != nil

fmt.println(result)

var sql string = "select @out_status as ret_status"

selectinstance, err := db.prepare(sql)

if err != nil

defer selectinstance.close()

var ret_status int

err = selectinstance.queryrow().scan(&ret_status)

if err != nil

fmt.println(ret_status)

return ret_status

}

golang mysql批量插入例項

業務邏輯 tcp接收訊息後,先將訊息儲存到資料庫再進行後續操作。問題 壓測發現,tcp連線非常多,訊息更多,每秒10000條訊息時,程式會記憶體溢位。解決 自然就想到了,問題出在不能及時把訊息處理掉的問題。所以先想能不能加快mysql的處理流程,可以定時批量插入代替及時插入。思路 1.接收tcp訊息...

儲存過程系列之儲存過程sql查詢儲存過程的使用

1.查詢某個表被哪些儲存過程 以下簡稱 sp 使用到 select distinct object name id from syscomments where id in select object id from sys.objects where type p and text like ta...

儲存過程系列之儲存過程sql查詢儲存過程的使用

1.查詢某個表被哪些儲存過程 以下簡稱 sp 使用到 select distinct object name id from syscomments where id in select object id from sys.objects where type p and text like ta...