oracle - 循环经过不同时间的波谷数据块
问题描述
我在 Oracle 数据库版本 7 上使用 Oracle Forms 10g。我有一个数据块,它通过两种不同的方式刷新(新的 execute_query):
1.A按钮如何实现:
PROCEDURE refresh
IS
ID NUMBER;
BEGIN
ID := :myblock.id;
GO_BLOCK ('myBlock');
EXECUTE_QUERY;
-- Keep the record selected after the refresh
POSITION (ID);
END;
PROCEDURE POSITION (ID IN NUMBER)
IS
L_record NUMBER (5) := NULL;
BEGIN
GO_BLOCK ('myBlock');
GO_ITEM ('myBlock.ID');
FIRST_RECORD;
LOOP
IF :myblock.id = myID THEN
L_record := GET_BLOCK_PROPERTY ('myBlock', CURRENT_RECORD);
END IF;
EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE' OR :myblock.ID = myID;
NEXT_RECORD;
END LOOP;
IF L_record IS NOT NULL THEN
GO_RECORD (L_record);
END IF;
END;
2.另一个是执行此操作的另一个按钮:
PROCEDURE newRefresh
IS
ID NUMBER;
BEGIN
ID := :myblock.id;
refresh;
POSITION (ID);
END;
忽略这两个按钮的原因,我的问题是当我调用第二个按钮时,POSITION
程序的第一次调用耗时太长(因为我们有很多记录和POST_QUERY
触发器),但是同一个程序的第二次调用非常快。这种行为的原因是什么?有没有最快的方法将焦点定位在之前选择的同一条记录上?
解决方案
为什么慢?谁知道……我们所能做的就是盲目猜测,离实际原因还很远。数据太少,无法计算。我建议您在调试模式下运行表单(因为 Forms 10g 允许它)并跟踪它的执行以查看发生了什么。
从更快的定位开始:考虑这种方法:
- 创建一个参数,让我们调用它
position
刷新按钮将:
-- save current position :parameter.position := :system.trigger_record; go_block('myBlock'); execute_query; -- go to previously saved position go_record(:parameter.position);
(顺便说一句,您真的在使用 Oracle 数据库 7.x 版吗?哇!)
推荐阅读
- javascript - 无法获取嵌套数据中的密钥
- android - Telephonymanager getAllCellsInfo 返回错误的注册单元数
- javascript - Ajax/Axios cookie 未设置,但仍包含在以下请求中
- html - 视频不工作的引导轮播
- node.js - Typescript 扩展 HTTP 响应接口
- fiddler - Fiddler 未捕获任何浏览器流量并向我显示此错误
- vue.js - 标题中的 vue 转译文本 - 可访问性
- python - Flask / Python:在保存前修改上传的文件数据
- python - K-Means 输出未按预期显示
- java - 通过流式传输和过滤转换带有条件的 for 循环