Oracle Apex 5.1: разделение значений элемента страницы - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь разделить значения элемента страницы в Oracle Apex 5.1. Сначала я сопоставил значения для автозаполнения. Пользователи должны знать отдел сотрудников. Результат сохраняется в элементе страницы PX_Employee.

select name || ',' || department from table;

Результат: Джон Купер, Department1

Чтобы получить электронную почту Джона Купера, мне нужно отделить значения друг от друга. Для получения электронного письма я использую этот код (работает нормально без concat)

DECLARE
  mail VARCHAR(40);
BEGIN 
  select email 
    into mail 
    FROM table 
    WHERE NAME = :PX_Employee;

  :PX_MAIL := mail;

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    mail := NULL;
END; 

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Простой SUBSTR с INSTR делает работу. Несколько заметок:

  • вам не нужна локальная переменная; поместите результат непосредственно в элемент PX_MAIL
  • , чтобы НЕ обрабатывать возможные NO_DATA_FOUND, используйте статистическую функцию (например, MAX, которую я сделал):
    • если есть сотрудник с таким именем, SELECT вернет его адрес электронной почты
    • если два (или более) сотрудника с одинаковыми именами, он вернет адрес электронной почты последнего сотрудника (отсортированный в алфавитном порядке). Это возможная ситуация; вы бы предпочли НЕ полагаться на имена в качестве идентификаторов - переключитесь на какой-то уникальный идентификатор
    • если с таким сотрудником нет строки, он не вернет NO_DATA_FOUND, но NULL (так что вам не нужно обрабатывать это отдельно)

begin
  select max(t.mail)
    into :PX_MAIL
    from your_table t
    where t.name = substr(:PX_EMPLOYEE, 1, instr(:PX_EMPLOYEE, ',') - 1);
end;

Например:

SQL> with test (px_employee) as
  2    (select 'John Cooper, Department 1' from dual)
  3  select substr(PX_EMPLOYEE, 1, instr(PX_EMPLOYEE, ',') - 1)
  4  from test;

SUBSTR(PX_E
-----------
John Cooper

SQL>
0 голосов
/ 05 сентября 2018

Вы можете использовать функцию Apex Util STRING_TO_TABLE, чтобы снова разделить строку и извлечь имя таким образом.

DECLARE
    l_vc_arr2    APEX_APPLICATION_GLOBAL.VC_ARR2;
    mail VARCHAR(40);
BEGIN
    l_vc_arr2 := APEX_UTIL.STRING_TO_TABLE('John Cooper, Department1', ',');
    BEGIN select email into mail FROM table WHERE NAME = l_vc_arr2(1);
END;
...