ORACLE apex - циклический просмотр элементов флажков с использованием PL / SQL - PullRequest
0 голосов
/ 18 октября 2018

У меня есть флажок на моей странице P3_Checkbox1, который заполняется из базы данных.Как я могу перебрать все проверенные значения своего флажка в коде PL / SQL?

Я предполагаю, что APEX_APPLICATION.G_F01 используется только сгенерированными флажками sql, и я не могу использовать его для обычного checbox, так как он не заполняетсяМассив G_Fxx.

1 Ответ

0 голосов
/ 18 октября 2018

Кажется, теперь я понимаю, что вы говорите.

Например, предположим, что флажок 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 строку.

...