Oracle apex 在Oracle APEX 5.1中,如何在特定条件下调用特定Lov?
我有两个共享组件的LOV,希望实现上述目标。如何完成它?两个选项: 在每个LOV中创建两个项目,然后根据您的需求调整其显示,使其仅显示其中一个。 忘记共享组件LOV,使用函数返回要在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
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变量。但是,创建两个项目有缺点和问题。例如,当源是一个数据库列时,您将无法创建多个这样的项,这意味着您需要一个中介和计算来设置其值。如果使用条件,它也不能是动态的。第二种选择更加可行。一个包含语句的包可以充当一个共享组件。一个小提示:重缩进都是一堆额外丢失的空白。