Oracle apex 在Oracle APEX 5.1中,如何在特定条件下调用特定Lov?

Oracle apex 在Oracle APEX 5.1中,如何在特定条件下调用特定Lov?,oracle-apex,oracle-apex-5.1,Oracle Apex,Oracle Apex 5.1,我有两个共享组件的LOV,希望实现上述目标。如何完成它?两个选项: 在每个LOV中创建两个项目,然后根据您的需求调整其显示,使其仅显示其中一个。 忘记共享组件LOV,使用函数返回要在LOV中使用的查询,其中只包含一项,不包含显示条件。比如: IF :P123_Type = 'C' THEN RETURN LOV_1 ELSE RETURN LOV_2 END IF; DESC apex_application_lovs Name

我有两个共享组件的LOV,希望实现上述目标。如何完成它?

两个选项:

在每个LOV中创建两个项目,然后根据您的需求调整其显示,使其仅显示其中一个。 忘记共享组件LOV,使用函数返回要在LOV中使用的查询,其中只包含一项,不包含显示条件。比如:

IF :P123_Type = 'C' THEN
  RETURN    
     LOV_1  
ELSE    
  RETURN    
     LOV_2  
END IF;  
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)

共享组件LOV可通过apex_应用程序_LOV视图访问

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

IF :P123_Type = 'C' THEN
  RETURN    
     LOV_1  
ELSE    
  RETURN    
     LOV_2  
END IF;  
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)

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

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

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;

注意我是如何将单引号折叠起来以避开它们的;如果需要,您可以选择以不同的方式转义这些字符。

最好不要使用ID:导出和导入(如转入生产)可能会完全改变ID。硬编码ID从来不是一个好主意。lovs视图具有诸如应用程序id和值列表名称之类的列,允许完全的灵活性。此外,您可以在视图的选定列上使用%TYPE定义ret变量。但是,创建两个项目有缺点和问题。例如,当源是一个数据库列时,您将无法创建多个这样的项,这意味着您需要一个中介和计算来设置其值。如果使用条件,它也不能是动态的。第二种选择更加可行。一个包含语句的包可以充当一个共享组件。一个小提示:重缩进都是一堆额外丢失的空白。