oracle 存储过程 debugger 和 execute 的结果不一样

mingxuan3000 2010-01-18 05:57:09
oracle 存储过程中 debugger 和 execute 的结果不一样
存储过程中有个循环更新一个表的操作。
存储过程中用到了一个数组,数组在每次循环中付不同的值 ,然后用数组的值更新这个表

debugger 执行结果正确,每条结果不一样,用execute 执行后 好像表中每条结果都一样了。。。

请问是不是和这个数组有关系?
这里面是不是有类似地址引用有关的问题?
另外哪有这方面的资料?

...全文
198 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
KnowKjava 2010-01-19
  • 打赏
  • 举报
回复
debugger
mingxuan3000 2010-01-19
  • 打赏
  • 举报
回复
是一个全局变量的问题。。。
第二次执行的时候变量没清空
小灰狼W 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mingxuan3000 的回复:]
是一个全局变量的问题。。。
第二次执行的时候变量没清空
[/Quote]
不错,自己能发现问题并解决是最好的
如果全局变量指的是数据库里包变量的话,注意这个全局仅限于session内
tangren 2010-01-18
  • 打赏
  • 举报
回复
pl/sql dev工具不错,还是蛮稳定的,没发现什么BUG,可能不深入吧,呵呵;
这种问题,多半应从变量命名,程序是否有逻辑错误去找
mingxuan3000 2010-01-18
  • 打赏
  • 举报
回复
不是地址的话 ,那可能是别的问题了,别的我自己去看
谢谢大家,问题解决了来结贴。。。
小灰狼W 2010-01-18
  • 打赏
  • 举报
回复
这里传递的是数值,不是地址
crazylaa 2010-01-18
  • 打赏
  • 举报
回复
crazylaa 2010-01-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mingxuan3000 的回复:]
那个end loop 是忘记删掉了

全部代码的意思也就这样

那个数组有没有 “地址传递” 这种意思?

[/Quote]
不明白你的地址传递指的是什么?
每次重新赋值,就会覆盖
FOR TABLE_A IN CUR01
LOOP
ARRAY_USE(1) := TABLE_A.TIME1; //第二此循环时,这里会把第二个time1的值覆盖数组原来的值
ARRAY_USE(2) := TABLE_A.TIME2; //第二此循环时,这里会把第二个time2的值覆盖数组原来的值
IF CUR02_COUNT >= 1 THEN
FOR I IN 1..10
LOOP
IF T_TIMEITEM_NOS(I) IS NOT NULL THEN
update_table_C(ARRAY_USE);
END IF;
END LOOP;
END IF;
END LOOP;
COMMIT;
mingxuan3000 2010-01-18
  • 打赏
  • 举报
回复
那个end loop 是忘记删掉了

全部代码的意思也就这样

那个数组有没有 “地址传递” 这种意思?
crazylaa 2010-01-18
  • 打赏
  • 举报
回复
楼主还是把整个贴出来吧
crazylaa 2010-01-18
  • 打赏
  • 举报
回复
看来看去多了个end loop。。。
wh62592855 2010-01-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wildwave 的回复:]
我很好奇300分怎么发出来的..
[/Quote]发在别的版 再转过来?
mingxuan3000 2010-01-18
  • 打赏
  • 举报
回复

PROCEDURE update_table_C
(
ARRAY_USE IN SYUGYO_DETAIL_TIME_ARRAY )
IS
BEGIN
UPDATE TABLE_C
SET TIME1 = ARRAY_USE(1) ,
TIME2 = ARRAY_USE(2) ,
WHERE TABLE_C.XX='123'
END update_table_C;


update_table_C就是简单的用数组的值更新
小灰狼W 2010-01-18
  • 打赏
  • 举报
回复
CUR02_COUNT T_TIMEITEM_NOS update_table_C不知道是什么
FOR TABLE_A IN CUR01
LOOP
ARRAY_USE(1) := TABLE_A.TIME1;
ARRAY_USE(2) := TABLE_A.TIME2;

END LOOP;
看起来很奇怪,数组只取游标中最后一条记录的两字段值?
for i in 1..10这个也不明白为什么是1到10,不过重点可能是
update_table_C(ARRAY_USE);
这个过程的代码能否贴出来
mingxuan3000 2010-01-18
  • 打赏
  • 举报
回复

PROCEDURE update_table
(

)
IS
type SYUGYO_DETAIL_TIME_ARRAY is table of NUMBER index by binary_integer;
ARRAY_USE SYUGYO_DETAIL_TIME_ARRAY;

/* カーソル 就業明細(日)*/
CURSOR CUR01
IS
SELECT A.*
FROM TABLE_A A

BEGIN
BEGIN

FOR TABLE_A IN CUR01
LOOP
ARRAY_USE(1) := TABLE_A.TIME1;
ARRAY_USE(2) := TABLE_A.TIME2;

END LOOP;
IF CUR02_COUNT >= 1 THEN
FOR I IN 1..10
LOOP
IF T_TIMEITEM_NOS(I) IS NOT NULL THEN
update_table_C(ARRAY_USE);
END IF;
END LOOP;
END IF;
END LOOP;
COMMIT;
END;
END update_table;


上面的代码是个大概的意思,update_table_C 中用到那个数组
palm_civet 2010-01-18
  • 打赏
  • 举报
回复
debug与execute结果不一样?估计是plsql developer的bug,经常碰到很多bug

用oracle sql developer的调试功能试试,oracle自己的程序应该没有什么问题吧
mingxuan3000 2010-01-18
  • 打赏
  • 举报
回复
就是 PLSQL Developer的 test,
test执行正确,然后用execute执行就出现上面的问题

更新表时的条件应该是正确的
我整理个大概的代码一会发上来
小灰狼W 2010-01-18
  • 打赏
  • 举报
回复
我很好奇300分怎么发出来的..
小灰狼W 2010-01-18
  • 打赏
  • 举报
回复
没用过debugger,plsql dev的debug?
存储过程循环和更新部分这么写的,更新表时的条件是否正确

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧