【问题标题】:Search records on block very slow oracle forms在块非常慢的 oracle 表单上搜索记录
【发布时间】:2020-01-20 09:31:35
【问题描述】:

我有输入访问号码和搜索记录的程序。但是这个程序搜索记录需要一些时间 3 到 4 分钟,并且块有 12672 条记录。如何优化程序以快速搜索记录。

代码:

DECLARE 
BEGIN
IF :CTRL_BLOCK.SRCH_VISITNO IS NULL THEN
     MESSAGE('Please enter Visit No...');
     GO_ITEM('SRCH_VISITNO');
ELSE
   BEGIN
         GO_BLOCK('cpvdtl');
         FIRST_RECORD;
         LOOP
             IF :cpvdtl.visitno = :CTRL_BLOCK.srch_visitno THEN
            exit;
         ELSE
            NEXT_RECORD;
         END IF;
       EXIT WHEN :SYSTEM.LAST_RECORD='TRUE';
         END LOOP;
     EXCEPTION
         WHEN NO_DATA_FOUND THEN
            MESSAGE('No Data found...!');
     END;               
         END IF;
     :CTRL_BLOCK.srch_visitno := null;
go_item('cpvdtl.visitno');
END;

【问题讨论】:

  • 您通常不会搜索表单块,这会很慢。您通常搜索数据库并将结果显示在一个块中。
  • @Tony Andrews 当表单打开时,记录已经显示在数据块上。然后具体不搜索数据块
  • 是的,这就是我的观点——应该对数据块进行搜索:-)

标签: oracle oracle11g oracleforms


【解决方案1】:

为什么要重新发明轮子?

默认表单功能运行良好,如下所示:

  • 在表上创建块
  • 运行表单
  • 进入查询模式
  • 在任意列中输入搜索条件(包括通配符)
  • 执行查询

如果任何记录符合条件,它将显示在屏幕上。


如果您坚持使用自己的搜索字段,请创建它(您已经这样做了)。那么:

  • 我建议你创建一个按钮
  • 创建一个WHEN-BUTTON-PRESSED 触发器,它将
    • 利用内置的SET_BLOCK_PROPERTY,使用ONETIME_WHERE(或DEFAULT_WHERE;看看哪个更合适)属性,将搜索字段的值设置到块的where子句中
    • EXECUTE_QUERY

为什么是按钮而不只是搜索字段?因为您随后将使用WHEN-VALIDATE-ITEM 触发器到SET_BLOCK_PROPERTY,但您不能在该触发器中使用EXECUTE_QUERY,因为它是一个受限制的过程。是的,您可以使用KEY-NEXT-ITEM 触发器,但是 - 如果用户使用鼠标导航出搜索字段怎么办?那个触发器不会触发。我会说那个按钮是一个更简单的选择。

【讨论】:

  • 如果默认的WHERE只是引用搜索字段,则不需要动态设置WHERE子句。
  • 不错的收获!谢谢你,@Andy。
猜你喜欢
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 2018-12-31
  • 2014-05-04
  • 2012-06-10
  • 2021-11-13
  • 2016-03-12
  • 2016-08-20
相关资源
最近更新 更多