Кажется, теперь я понимаю, что вы говорите.
Например, предположим, что флажок P3_CHECKBOX1
допускает 3 значения (отображение / возврат):
- Отсутствует: -1
- Неизвестно: 0
- Здесь: 1
Я создал кнопку (которая будет просто SUBMIT
страница) и два текстовых элемента, которые будут отображать проверенные значения: P3_CHECKED_VALUES
и P3_CHECKED_VALUES_2
.
Затем я создал процесс , который запускается при нажатии кнопки.Процесс выглядит следующим образом (прочитайте также комментарии):
begin
-- This is trivial; checked (selected) values are separated by a colon sign,
-- just like in a Shuttle item
:P3_CHECKED_VALUES := :P3_CHECKBOX1;
-- This is what you might be looking for; it uses the APEX_STRING.SPLIT function
-- which splits selected values (the result is ROWS, not a column), and these
-- values can then be used in a join or anywhere else, as if it was result of a
-- subquery. The TABLE function is used as well.
-- LISTAGG is used just to return a single value so that I wouldn't have to worry
-- about TOO-MANY-ROWS error.
with
description (code, descr) as
(select -1, 'Absent' from dual union all
select 0 , 'Unknown' from dual union all
select 1 , 'Here' from dual),
desc_join as
(select d.descr
from description d join (select * from table(apex_string.split(:P3_CHECKED_VALUES, ':'))) s
on d.code = s.column_value
)
select listagg(j.descr, ' / ') within group (order by null)
into :P3_CHECKED_VALUES_2
from desc_join j;
end;
Предположим, что значения Absent и Unknown были проверены.Результат этого процесса PL / SQL:
P3_CHECKED_VALUES = -1:0
P3_CHECKED_VALUES_2 = Absent / Unknown
Вы можете переписать его, как хотите;это только один пример.
Ключевые слова:
APEX_STRING.SPLIT
TABLE
функция
Надеюсь, это поможет.
[РЕДАКТИРОВАТЬ: циклически проходить через выбранные значения]
Циклировать по этим значениям не сложно;Вы бы сделали это следующим образом (см. курсор FOR
цикл):
declare
l_dummy number;
begin
for cur_r in (select * From table(apex_string.split(:P3_CHECKED_VALUES, ':')))
loop
select max(1)
into l_dummy
from some_table where some_column = cur_r.column_value;
if l_dummy is null then
-- checked value does not exist
insert into some_table (some_column, ...) valued (cur_r.column_value, ...);
else
-- checked value exists
delete from some_table where ...
end if;
end loop;
end;
Однако я не уверен, что вы имели в виду, говоря, что «конкретная комбинация находится в базе данных».Означает ли это, что вы храните разделенные двоеточиями значения в столбце этой таблицы?Если это так, приведенный выше код также не будет работать, поскольку вы будете сравнивать, например,
-1
с 0:-1
, а затем 0
с 0:-1
, что не будет истинным (за исключением самых простых случаев, когда проверяемые и сохраненные значения имеют только одно значение).
Хотя «множественный выбор» Apex выглядит хорошо, ониможет стать кошмаром, когда вы действительно делаете что-то с ними (как в вашем случае).
Возможно, вам следует сначала установить флажки sort , отсортировать значения базы данных, а затем сравнить эти две строки.
Это означает, что LISTAGG
может снова пригодиться, например,as
listagg(j.descr, ' / ') within group (order by j.descr)
Значения базы данных могут быть отсортированы следующим образом:
SQL> with test (col) as
2 (select '1:0' from dual union all
3 select '1:-1:0' from dual
4 ),
5 inter as
6 (select col,
7 regexp_substr(col, '[^:]+', 1, column_value) token
8 from test,
9 table(cast(multiset(select level from dual
10 connect by level <= regexp_count(col, ':') + 1
11 ) as sys.odcinumberlist))
12 )
13 select
14 col source_value,
15 listagg(token, ':') within group (order by token) sorted_value
16 from inter
17 group by col;
SOURCE SORTED_VALUE
------ --------------------
1:-1:0 -1:0:1
1:0 0:1
SQL>
После того, как они отсортированы, вы можете сравнить их или INSERT
или DELETE
строку.