一个关于支付的SQL-Procedure

本文介绍了一个用于处理网站用户提现请求的SQL Server存储过程。该过程包括更新用户账户余额、冻结金额,并记录提现日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天测试了一下,昨天的没过,重新改了一下

 

------------------------------------
--
用途:增加一条记录 
--
项目名称:CodematicDemo
--
说明:
--
时间:2009-10-28 11:03:09
--
----------------------------------
Create PROCEDURE [dbo].[UP_RegPay_ADD]
@RID int output,
@R_UserName nvarchar(500),
@R_UserType int,
@R_PayMoney money,
@R_CommissionMoney money,
@R_RegUserIP nvarchar(50),
@R_RegDate datetime,
@R_Remarks nvarchar(4000)

 
AS
Declare @ErrorMessage varchar(1000),@R_PayBankName nvarchar(250),
        
@R_PayBankNumer varchar(100),@R_PayBankAddress varchar(1000),
        
@R_PayBankUserName varchar(150),@R_PayLog nvarchar(4000),
        
@returnValue int

Set @returnValue=0
Set @R_PayLog =  Convert(varchar,@R_RegDate,20)+':用户'+@R_UserName+'申请账户提现,提现金额:'+Convert(varchar,@R_PayMoney,1)+',手续费:'+
                 
Convert(varchar,@R_CommissionMoney,1)
Set @R_PayLog = @R_PayLog + ',备注:'+@R_Remarks
--Set @ErrorMessage =  '操作失败,SQL错误,错误号:'
Begin Transaction
    
IF @R_UserType = 1 
        
Begin
            
Update [WebSiteHost] Set
                
[Money] = [Money] - @R_PayMoney - @R_CommissionMoney,[W_FreezingMoney] = [W_FreezingMoney] + @R_PayMoney
            
Where [Money] > @R_PayMoney + @R_CommissionMoney And [Appearance] = 1 And [UserName] = @R_UserName

            
if @@rowCount < 1 Or @@Error <> 0  GOTO Error

            
Select @R_PayBankName = [Bank],@R_PayBankNumer = [CardNumber],@R_PayBankAddress = [BankAddress],@R_PayBankUsername=[BankName]
            
From [WebSiteHost] Where  [Appearance] = 1 And [UserName] = @R_UserName

            
if @R_PayBankNumer is null or @@error <> 0  GOTO Error

            
INSERT INTO [RegPay](
                
[R_UserName],[R_UserType],[R_PayMoney],[R_CommissionMoney],[R_RegUserIP],[R_RegDate],
                
[R_Remarks],[R_PayLog],[R_PayBankName],[R_PayBankNumer],[R_PayBankAddress],[R_PayBankUserName]
            )
VALUES(
                
@R_UserName,@R_UserType,@R_PayMoney,@R_CommissionMoney,@R_RegUserIP,@R_RegDate,
                
@R_Remarks,@R_PayLog,@R_PayBankName,@R_PayBankNumer,@R_PayBankAddress,@R_PayBankUserName
            )
            
            
if @@rowCount < 1 Or @@Error <> 0  GOTO Error

            
SET @RID = @@IDENTITY
            
            
Set @ErrorMessage = '提现申请成功'
            
Set @returnValue = 1    
            
Exec [UP_FinanceLogin_ADD] null,'1','申请提现',@R_UserName,@R_RegDate,@R_RegUserIP,'','',@ErrorMessage
        
End
    
Commit Transaction
    
return 0
Error:
    
Set @ErrorMessage = '提现申请操作失败,SQL错误,错误号:' + str(@@Error)
    
Set @RID = 0
    
Exec [UP_FinanceLogin_ADD] null,'1','申请提现',@R_UserName,@R_RegDate,@R_RegUserIP,'','',@ErrorMessage
    
RollBack Transaction  --回滚操作
--
记录操作

 

转载于:https://www.cnblogs.com/xy109/archive/2009/10/28/1591244.html

CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
<think>我们被要求查找在MySQL中一次性执行多个SQL语句的方法。根据引用[3]中的信息,我们可以知道在大多数数据库中是可以一次执行多个SQL语句的,但通常需要用分号(;)来分隔每个语句。在MySQL中,分号是标准的语句分隔符。然而,需要注意的是,在默认情况下,MySQL的某些客户端(如PHP的mysql扩展)可能不支持一次执行多个语句,这是为了防止SQL注入攻击。但是,在MySQL命令行客户端或支持多语句执行的客户端(如某些编程语言的驱动)中是可以这样做的。在编程语言中,例如在Go语言中(引用[4]提到),我们可以通过设置客户端参数来允许执行多个语句。例如,在Go中使用database/sql包时,需要在连接字符串中加上参数`multiStatements=true`。另外,引用[2]中展示了一个动态构建SQL语句并执行的例子,使用了`execsp_executesql`(这是SQLServer的语法),但在MySQL中,我们可以使用`PREPARE`和`EXECUTE`来动态执行SQL语句(引用[1]中提到了在存储过程中拼接SQL语句并动态执行)。因此,总结如下:###方法1:在MySQL命令行客户端中直接在命令行中,用分号分隔多个语句,例如:```sqlSELECT*FROMtable1;SELECT*FROMtable2;```###方法2:在存储过程中可以使用动态SQL(通过PREPARE和EXECUTE)来执行多个语句。例如(参考引用[1]):```sqlDELIMITER$$CREATEPROCEDUREexecute_multiple()BEGINSET@sql='SELECT*FROMtable1;SELECT*FROMtable2;';PREPAREstmtFROM@sql;EXECUTEstmt;DEALLOCATEPREPAREstmt;END$$DELIMITER;```然后调用这个存储过程:```sqlCALLexecute_multiple();```###方法3:在应用程序中在应用程序中,需要确保使用的数据库驱动支持多语句执行,并且开启这个功能。例如,在Go语言中(参考引用[4]),连接数据库时:```godsn:="user:password@tcp(127.0.0.1:3306)/dbname?multiStatements=true"db,err:=sql.Open("mysql",dsn)```然后,可以一次执行多个语句:```gosqlScript:=`UPDATEtable1SETcol1='value1'WHEREid=1;SELECT*FROMtable2;`_,err:=db.Exec(sqlScript)//或者使用db.Query()如果有查询语句```###注意事项:1.**安全风险**:一次执行多个语句可能增加SQL注入的风险,特别是当使用用户输入构建SQL语句时。因此,应谨慎使用,并确保输入被正确转义。2.**事务处理**:如果需要确保多个语句作为一个事务执行(要么全部成功,要么全部失败),应该显式地使用事务(BEGIN/COMMIT/ROLLBACK)。3.**驱动支持**:并非所有驱动都默认支持多语句执行,需要检查并配置。4.**结果集处理**:如果多个语句中有多个查询,那么返回多个结果集。在应用程序中需要能够处理多个结果集(例如,使用NextResultSet方法)。###示例(在Go中处理多个结果集):```gorows,err:=db.Query("SELECTidFROMtable1;SELECTnameFROMtable2;")iferr!=nil{log.Fatal(err)}deferrows.Close()//处理第一个结果集forrows.Next(){varidintiferr:=rows.Scan(&id);err!=nil{log.Fatal(err)}fmt.Println(id)}//移动到下一个结果集rows.NextResultSet()//处理第二个结果集forrows.Next(){varnamestringiferr:=rows.Scan(&name);err!=nil{log.Fatal(err)}fmt.Println(name)}```###结论:在MySQL中执行多个SQL语句,可以通过以下方式:-命令行客户端:直接使用分号分隔。-存储过程:使用动态SQL(PREPARE/EXECUTE)。-应用程序:配置数据库连接参数以支持多语句执行,并正确处理多个结果集。请根据具体的使用场景选择合适的方法。§§相关问题§§1.如何在MySQL中防止多语句执行带来的SQL注入风险?2.如何在MySQL事务中执行多个SQL语句?3.在Python中如何执行MySQL的多个SQL语句?</think>### 在 MySQL 中一次性执行多个 SQL 语句的方法 #### 1. **使用分号分隔语句**(命令行或支持多语句的客户端) ```sql UPDATE users SET status=1 WHERE id=101; INSERT INTO logs (action) VALUES ('updated user'); SELECT * FROM users WHERE id=101; ``` **关键点**: - 每个语句用分号 `;` 分隔(引用[3]) - 适用于 MySQL 命令行客户端、MySQL Workbench 等工具 - 部分编程语言驱动需额外配置(如 Go 需加 `multiStatements=true` 参数,引用[4]) #### 2. **存储过程动态执行**(推荐安全方案) ```sql DELIMITER $$ CREATE PROCEDURE batch_operations() BEGIN SET @sql1 = 'UPDATE products SET stock=stock-10 WHERE id=5'; SET @sql2 = 'INSERT INTO orders (product_id) VALUES (5)'; PREPARE stmt1 FROM @sql1; EXECUTE stmt1; PREPARE stmt2 FROM @sql2; EXECUTE stmt2; DEALLOCATE PREPARE stmt1; DEALLOCATE PREPARE stmt2; END$$ DELIMITER ; -- 执行存储过程 CALL batch_operations(); ``` **优势**: - 避免 SQL 注入风险(引用[1]) - 支持事务控制(添加 `START TRANSACTION;` 和 `COMMIT;`) - 可复用执行逻辑 #### 3. **编程语言批量执行**(应用层实现) 以 Go 为例(引用[4]): ```go // 连接字符串添加 multiStatements=true dsn := "user:pass@tcp(localhost:3306)/db?multiStatements=true" // 多语句执行 sql := ` DELETE FROM temp_data WHERE created_at < NOW()-INTERVAL 1 DAY; OPTIMIZE TABLE temp_data; ANALYZE TABLE main_data; ` _, err := db.Exec(sql) ``` #### 4. **事务块执行**(保证原子性) ```sql START TRANSACTION; UPDATE accounts SET balance=balance-100 WHERE user_id=1; UPDATE accounts SET balance=balance+100 WHERE user_id=2; INSERT INTO transactions (from_user, to_user) VALUES (1, 2); COMMIT; -- 或 ROLLBACK 回滚 ``` ### 注意事项: 1. **安全限制**: - 部分驱动默认禁用多语句(防止 SQL 注入) - PHP 的 `mysqli` 需用 `mysqli_multi_query()` 2. **错误处理**: - 批量执行中某条失败时,默认后续语句仍会执行 - 需配合事务保证原子性(全部成功或全部回滚) 3. **性能影响**: - 单次传输大量语句可能超时(调整 `max_allowed_packet`) - 建议每批次不超过 1000 条语句 ### 配置表示例: | 场景 | 方法 | 是否需事务 | 风险 | |------|------|------------|------| | 数据迁移 | 分号分隔 | 建议启用 | 中等 | | 支付操作 | 存储过程 | 必须启用 | 低 | | 定期清理 | 编程执行 | 可选 | 低 | > 在 MySQL 8.0+ 中,分号分隔是标准方法(引用[3]),但动态 SQL 在存储过程中更安全(引用[1])。 --- ### 常见错误解决 **问题**:出现 `Commands out of sync` 错误 **方案**:在编程中正确处理多结果集 ```go // Go 示例(引用[4]) rows, _ := db.Query("SELECT ...; UPDATE ...;") defer rows.Close() for rows.Next() { /* 处理第一个结果集 */ } rows.NextResultSet() // 跳到下一个结果集 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值