今天下午,突然收到实施人员在现在场发回来的问题,其中有一个问题我怎么也想不出原因,直到后上网找资料,并重新测试了程序,才发现这个问题。问题来自于数据库的一个存储过程。
--变量声明
-- ....
-- 判断游标是否结束
declare v_curOver integer default 0;
--声明游标
declare c_CCDZ cursor for
select nvl(COL1, '')
from TABLE1
where COL2=in_COL2;
--声明异常处理,当游标结束时触发此异常(此句要放在最后声明)
declare continue handler for not found
set v_curOver=1;
set v_curOver=0;
open c_CCDZ;
CCDZLoop:
loop
-- 注意:只有先fetch后才能有异常
fetch c_CCDZ into v_COL1;
if v_curOver=1 then
leave CCDZLoop;
end if;
update TABLE2 set COL11 = '01' where COL = v_COL1;
end loop CCDZLoop;
close c_CCDZ;
这里是在一个游标里更新另一个表。因为以前我做查询操作时都这样写的,但是不涉及到增改操作,当时自己测试大意时间又赶,随意测了一个数据(没想到数据只有一条记录),没问题就算通过了。以致出现了以下问题,游标里有N条记录,但是执行了一次更新语句,余下的被无视了,后来上网查了资料,才知道了,以上定义,更新操作时会使游标跳到末端,所以只更新了第一条记录。
于是我用了另一种方法。
declare cursor1 cursor for
select T1_COL2
from TABLE1
where T1_COL1 = in_COL1;
select count(1) into v_NUM from TABLE1 where T1_COL1 = in_COL1;
open cursor1;
cursorLoop1:
loop
fetch cursor1 into v_COL2;
if v_curOver=v_NUM then
leave cursorLoop1;
end if;
--更新
update TABLE2 set COL2 = '01' where COL1 = v_COL2;
set v_curOver = v_curOver + 1;
end loop cursorLoop1;
close cursor1;
这样就可以按预想那样更新数据了。当然以上只是本人参考了网上资料想到的方法,这里抛砖引玉,有更好的方法还请赐教,让大家都可以学习一下!
总结一下,方法1适合用于查询,靠判断游标的状态来循环;方法适用于更新,但要自己计算循环次数。
分享到:
相关推荐
- **`FOR UPDATE`选项**:指定游标为可更新游标,这样可以在游标中更新当前行的数据。 ```sql UPDATE tb_market_code SET market_code = '0' WHERE CURRENT OF cursor1; ``` 注意,`FOR UPDATE`不能与`GROUP BY`...
通过命令行或图形用户界面,用户可以快速检索所需信息,帮助他们解决在使用DB2过程中遇到的问题。 DB2ir,全称DB2 Interactive Repl,是一个命令行工具,允许用户与DB2数据库进行交互式的SQL查询和操作。它类似于...
需要注意的是,未加`WITH HOLD`选项的游标在事务结束时会被关闭,这在处理多线程或多事务场景时需要特别留意。 总之,DB2编程基础要点包括存储过程的创建、临时表的使用、指定数量记录的选取、游标的管理和事务控制...
通过以上方法,我们可以有效地查询DB2数据库中的锁状态,从而帮助解决可能遇到的与锁相关的性能问题或死锁问题。这些信息对于理解数据库中并发控制的行为至关重要,并且对于数据库管理员来说是非常有价值的诊断工具...
当需要修改游标当前指向的记录时,可以使用`UPDATE ... WHERE CURRENT OF cursor1;`的语法,但必须确保游标已经打开并定位到目标记录。 6. 错误处理: 在处理游标时,可能需要定义`CONTINUE HANDLER`来捕获特定...
- 在使用游标时,如果未使用 `WITH HOLD` 选项,`COMMIT` 和 `ROLLBACK` 操作会导致游标关闭。游标的处理有两种主要方式:一种是传统的声明、打开、获取和关闭步骤,另一种是使用 `FOR` 循环结构。使用 `WITH HOLD`...
- **游标**:解释游标的原理和使用方法,以及如何提高游标的性能。 - **索引优化**:探讨不同类型的索引(如B-tree索引、位图索引等),并分析它们对查询性能的影响。 - **并发控制**:介绍DB2中的并发控制机制,如...
4. **游标(Cursor)**:在处理大量数据时,游标允许逐行处理结果集,提供了更灵活的数据访问方式。 5. **存储过程和函数**:自定义的可重复使用的SQL代码块,可以包含复杂的业务逻辑。 6. **触发器(Trigger)**...
- `DB2常用SQL语句以及数据库原理.doc` 提供了对SQL语言基础的理解,包括SELECT查询、INSERT插入、UPDATE更新和DELETE删除等操作,以及如何在DB2环境中创建和管理表、视图、索引等数据库对象。 - 数据库原理部分...
10. **安全性与权限**:DB2提供了细粒度的权限控制,可以通过JDBC API设置和管理用户权限,如SELECT、INSERT、UPDATE和DELETE等。 综上所述,IBM DB2 JAR包在Java开发中扮演着至关重要的角色,为Java应用程序提供与...
- **CURSOR ORDER BY以后不能FOR UPDATE**:对于已排序的游标,不能使用FOR UPDATE子句。 - **程序中间不能自由改变隔离级别**:事务隔离级别在事务开始后不能更改。 - **UPDATE不能用一个表中的记录为条件修改另一...
4. **游标和循环**:在存储过程中使用游标进行逐行处理,以及如何构建嵌套循环逻辑。 5. **动态SQL**:在存储过程中动态生成并执行SQL语句,提高灵活性。 这份"DB2使用手册"将帮助读者从基础到高级全面掌握DB2...
总的来说,这份“DB2通用数据库自学教程”将带你走过DB2的学习旅程,从基础操作到高级应用,再到实际问题的解决。通过阅读下载说明.HTM和readme.txt,可以获取更具体的使用指南和注意事项。同时,不断实践和探索,是...
**注意:** Oracle和DB2中的游标语法类似,但在DB2中,`DECLARE`关键字用于声明游标。 ##### 3.2 UDF和触发器中显式游标的转换 **Oracle:** ```sql CREATE OR REPLACE FUNCTION get_data RETURN NUMBER IS CURSOR...
5. **数据库对象**:DB2中的主要数据库对象包括表、视图、索引、存储过程、触发器和游标。理解这些对象的作用及其创建、修改和删除的语法至关重要。 6. **安全性与权限管理**:DB2提供用户身份验证、角色、权限和...
2. **DB2 SQL扩展**:DB2作为IBM的产品,可能提供了一些特有的SQL扩展,比如存储过程、触发器、游标、视图等高级功能。 3. **DB2数据类型**:介绍DB2支持的数据类型,如整数、浮点数、字符串、日期时间等。 4. **...
7. **游标和存储过程**:DB2允许使用游标来逐行处理查询结果,并可以通过存储过程封装复杂的业务逻辑,提高代码复用和执行效率。 8. **并行查询和分区**:DB2支持并行查询,通过将大表分区,可以实现数据的水平分割...