• Obtaining Query Count Without executing a Query in Oracle D2k


    Obtaining Query Count Without executing a Query in Oracle D2k

    Obtaining a count of records that will be retrieved by EXECUTE_QUERY before actually performing it in a database block is especially useful when the requirement is to prevent navigation to a block when query hits are zero. A typical scenario of such a situation is when the detail block records exist on a separate canvas not visible on Form startup and the user is required to click a Details button to see them. Giving an alert message such as No Details exist when the user clicks the Details button is more meaningful than displaying a blank details screen, when no details exist for the chosen parent record.
    The technique given here avoids two performance issues. First, you do not want to perform a SELECT COUNT(*) from the corresponding base table mainly for performance reasons. Second, using :SYSTEM.LAST_QUERY and executing it dynamically using DBMS_SQL cause a bottleneck by executing the query on the server side explicitly, thus involving more trips.
    The solution is to do a COUNT_QUERY and get the QUERY_HITS for the corresponding block immediately following the COUNT_QUERY. The following function does the job:
     
    FUNCTION query_count (p_block_name VARCHAR2) RETURN NUMBER
    
    IS
    
    cnt NUMBER;
    
    BEGIN
    
    GO_BLOCK(p_block_name);
    
    COUNT_QUERY;
    
    cnt := GET_BLOCK_PROPERTY(p_block_name, QUERY_HITS);
    
    IF FORM_SUCCESS THEN
    
        RETURN (cnt);
    
    ELSE
    
         MESSAGE('Error in getting Query Hits for block '||:SYSTEM.CURRENT_BLOCK);
    
         RAISE FORM_TRIGGER_FAILURE;
    
    END IF;
    
    END;
    
    
    The preceding function can be called in the appropriate trigger, such as WHEN-BUTTEN-PRESSED, to achieve the desired functionality.
    The following WHEN-BUTTON-PRESSED trigger is defined for the Details button. It initially invokes the above query_count function to obtain the count of detail records for a particular master record. If this count is zero it throws an alert to indicate No Details exist. Otherwise, control navigates to the detail block and does an EXECUTE_QUERY.
     
    WHEN-BUTTON-PRESSED trigger of 'Details'button
    
    
    
    DECLARE
    
       v_cnt NUMBER;
    
    BEGIN
    
       v_cnt := query_count(<detail block name>);
    
       IF (v_cnt = 0) THEN
    
         p_show_alert('No Details exist.');
    
       ELSE
    
         GO_BLOCK(<detail block name>);
    
         EXECUTE_QUERY;
    
       END IF;
    
    END;
    
    
    This technique involves two tasks:
    • COUNT_QUERY is necessary to initiate the QUERY_HITS property of the block and should be immediately before the GET_BLOCK_PROPERTY statement.
    • Oracle Forms displays the message FRM-40355: Query will display 0 records when the query hits are zero as obtained by a call to COUNT_QUERY. This should be suppressed in an ON-MESSAGE trigger by using the following code:
       
      if message_type = 'FRM'and message_code = 40355 then
      
         null;
      
      else
      
        message(message_type||'-'||to_char(message_code)||': '||message_text);
      
      end if; 
  • 相关阅读:
    linux mono环境
    【百度杯】ctf夺旗大战,16万元奖励池等你拿
    【渗透技术】渗透测试技术分析_TomCat
    成功率“99%”!截止目前史上最强大电信诈骗术
    【sql注入】浅谈sql注入中的Post注入
    通过Weeman+Ettercap配合拿下路由器管理权限
    【sql注入教程】mysql注入直接getshell
    【云盘资料】Sql注入从菜鸟到高手系列教程
    【安全开发】浅谈JSP安全开发之XSS
    Python黑帽编程2.1 Python编程哲学
  • 原文地址:https://www.cnblogs.com/quanweiru/p/6220792.html
Copyright © 2020-2023  润新知