@@ERROR @@ROWCOUNT 返回的都是上一条SQL 语句后的执行信息。

本文探讨了在SQL中同时获取@@ROWCOUNT和@@ERROR变量时遇到的问题,并提供了解决方案。通过一个具体的例子展示了不同读取顺序对结果的影响。
摘要由CSDN通过智能技术生成

比如下面的SQL 语句:

select EmployeeID from employees  -- 这条SQL 语句返回9条记录
print(@@error)
print(@@ROWCOUNT)

返回的结果是:

(9 row弯月 affected)

0
0


select EmployeeID from employees  -- 这条SQL 语句返回9条记录
print(@@ROWCOUNT)
print(@@error)
返回的结果是:

(9 row弯月 affected)

9
0

原因,后一个打印出来的是前一个print 执行后的对应变量的结果。

如果想在一个语句执行后,即获得 @@ROWCOUNT 也获得 @@error,需要用一个SQL 语句把它们读出来:
declare @a int ,@b int
select EmployeeID from employees  -- 这条SQL 语句返回9条记录
select @a = @@ROWCOUNT,@b = @@error
print(@a)
print(@b)

在这个一句读取数据中,先取那个都无所谓。也就是 select @b = @@error,@a = @@ROWCOUNT 也可以。但是必须是一句,如果变成两句,就又有上面的问题了。

declare @a int ,@b int
select EmployeeID from employees  -- 这条SQL 语句返回9条记录
select @b = @@error
select @a = @@ROWCOUNT
print(@a)
print(@b)

返回结果:
(9 row弯月 affected)

1
0

declare @a int ,@b int
select EmployeeID from employees  -- 这条SQL 语句返回9条记录
select @a = @@ROWCOUNT
select @b = @@error
print(@a)
print(@b)
返回结果:
(9 row弯月 affected)

9
0

今天的一个Bug 就跟这个有关,找了很久,才发现是这里的原因。 SQL 说明书中写得很清楚,就是没注意。

 获取行数可以使用@@CURSOR_ROWS ,就没有这个限制了
### hvigor 构建过程中的 `failed :entry:default@prebuild` 错误分析 在处理 hvigor 的构建错误时,通常需要深入理解其预构建阶段的工作机制以及可能引发该问题的原因。以下是对这一问题的具体解析: #### 1. 预构建阶段的功能概述 Hvigor 是一种用于自动化生成代码或其他资源的工具,在其工作流程中,“prebuild” 表示项目的预构建阶段。此阶段的主要功能包括初始化环境变量、加载配置文件、执行必要的数据库操作等[^2]。 对于提到的 SQL 执行语句: ```sql SQLExec("Update ps_vendor set VENDOR_STATUS = 'I' where setid = :1 and vendor_id = :2", &SETID, VENDOR_ID); ``` 这段代码的作用是从指定表 (`ps_vendor`) 中更新特定记录的状态字段至 `'I'` 值。如果这条 SQL 更新失败,则可能导致后续依赖于这些数据的操作中断,从而触发 `failed :entry:default@prebuild` 错误[^1]。 #### 2. 可能原因及解决方案 以下是几个常见的导致此类错误的因素及其对应的解决方法: ##### (a) 数据库连接异常 如果数据库无法正常访问或者连接参数设置不正确,那么任何涉及数据库交互的任务都会失败。应确认数据库服务已启动并可被应用程序成功连通;同时验证所使用的用户名密码组合是否有足够的权限来修改目标表格的数据项[^3]。 ##### (b) 参数绑定失误 上述 SQL 使用了占位符 (:1 和 :2),这意味着实际运行前需将具体值赋给它们 (&SETID 和 VENDOR_ID) 。假如传递过来的是 null 或者非法字符序列,就有可能造成查询条件匹配不到预期的结果集进而抛出异常。因此要仔细检查输入参数的有效性和准确性[^4]。 ##### (c) 权限不足或约束冲突 即使能够定位到待更改的目标行,但如果当前会话缺乏 ALTER TABLE/UPDATE 等必要权利亦或是违反了一些定义好的业务逻辑(比如存在外键关联关系未解除先删除父级节点的情况),同样会引起事务回滚现象发生。此时建议联系 DBA 查看具体的拒绝理由并通过调整策略规避风险[^5]。 #### 3. 调试技巧分享 当遇到难以诊断的问题时候可以采取如下措施帮助快速定位根源所在: - **启用日志记录**: 大多数框架都支持不同级别的消息输出选项,默认情况下可能是关闭状态或者是仅保留严重警告以上等级的信息。通过降低阈值可以让开发者获得更多关于内部运作细节方面的线索。 - **逐步简化场景测试**: 尝试着移除那些非核心部分重新尝试编译直到找到最小重现单元为止。这样有助于排除干扰因素集中精力攻克关键环节上的障碍物。 --- ### 示例修复脚本 下面提供了一个简单的 Python 脚本来模拟如何捕获潜在的风险点以便进一步排查: ```python import cx_Oracle def update_status(setid, vendor_id): try: connection = cx_Oracle.connect('username/password@localhost/orcl') cursor = connection.cursor() sql_query = """ UPDATE ps_vendor SET VENDOR_STATUS='I' WHERE setid=:setid AND vendor_id=:vendor_id; """ result = cursor.execute(sql_query,{"setid":setid,"vendor_id":vendor_id}) connection.commit() print(f"{cursor.rowcount} rows updated.") except Exception as e: print(e) update_status('example_setid', 'example_vendor_id') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值