如何在Oracle APEX 5.1中针对特定条件调用某些Lov?

时间:2017-04-20 07:38:37

标签: oracle-apex oracle-apex-5.1

IF :P123_Type = 'C' THEN
  RETURN    
     LOV_1  
ELSE    
  RETURN    
     LOV_2  
END IF;  

我有2个共享组件的LOV&想要达到如上所述。怎么做到了?

3 个答案:

答案 0 :(得分:1)

可以通过apex_application_lovs视图访问共享组件LOV。

DESC apex_application_lovs

Name                   Null     Type           
---------------------- -------- -------------- 
WORKSPACE              NOT NULL VARCHAR2(255)  
WORKSPACE_DISPLAY_NAME          VARCHAR2(4000) 
APPLICATION_ID         NOT NULL NUMBER         
APPLICATION_NAME       NOT NULL VARCHAR2(255)  
LIST_OF_VALUES_NAME    NOT NULL VARCHAR2(255)  
LOV_TYPE                        VARCHAR2(7)    
LIST_OF_VALUES_QUERY            VARCHAR2(4000) 
LOV_ENTRIES                     NUMBER         
IS_SUBSCRIBED                   VARCHAR2(3)    
SUBSCRIBED_FROM                 VARCHAR2(297)  
LAST_UPDATED_BY                 VARCHAR2(255)  
LAST_UPDATED_ON                 DATE           
COMPONENT_COMMENT               VARCHAR2(4000) 
LOV_ID                 NOT NULL NUMBER         
REFERENCED_LOV_ID               NUMBER         
COMPONENT_SIGNATURE             VARCHAR2(436)

因此,您可以将页面上的“选择列表”项目上的值列表设置为 PL / SQL函数体返回SQL查询
作为函数体,您可以使用以下内容:

DECLARE
  ret apex_application_lovs.list_of_values_query%TYPE;
BEGIN
  IF :P123_Type = 'C' THEN
    select list_of_values_query 
      into ret
      from apex_application_lovs 
     where list_of_values_name = 'LOV_1';
  ELSE    
    select list_of_values_query  
      into ret
      from apex_application_lovs 
     where list_of_values_name = 'LOV_2';
  END IF;

  return ret;
END;

如果可以动态更改P123_TYPE并且此列表是级联列表,则需要在刷新列表时将项目添加到要提交到会话状态的项目。

答案 1 :(得分:0)

两个选项:

  • 根据您的每个LOV创建两个项目,然后根据您的要求调整其显示以仅显示其中一个。
  • 忘记共享组件LOV并使用函数返回要在LOV中使用的查询(仅包含一个项目且没有显示条件)。类似的东西:

    function f_get_lov(p_condition in number)
    return varchar2 as
        l_sql varchar2(4000);
    begin
        if p_condition = 1 then
      -- query lov_1
          l_sql := 'select display_value
                    ,      return_value
                      from tb1';
        else
          -- query lov 2
          l_sql := 'select display_value
                    ,      return_value
                      from tb2';
        end if;
    
        return l_sql;
    end f_get_lov;
    

答案 2 :(得分:0)

为什么不根据功能创建动态lov?这与Boris建议的不同,因为它不需要您在APEX之外创建一个函数,而只需要另一个LOV。

Declare 
  v_type varchar2(1) := :P123_TYPE;
 Begin
  If v_type = 'C' then
    Return 'select column_a d, column_b r
                   from some_table
                  where some_column = ''CONDITION 1'';
  Else
     Return 'select column_a d, column_b r
                   from some_table
                  where some_column = ''CONDITION 2'';
  End if;
End;

注意我是如何在单引号上加倍逃避它们的;如果需要,你可以选择以不同的方式逃避这些角色。