Как проверить фильтры с помощью функции substr и получить результаты из хранимой процедуры в Oracle PLSQL? - PullRequest
0 голосов
/ 26 сентября 2019

Я создал хранимую процедуру, которая имеет 2 фильтра в предложении where.Я включил один фильтр и могу получить результаты. Однако, когда я пытаюсь включить второй, процедура не отображает никаких значений.

Пользователь вводит параметр из экрана пользовательского интерфейса и нажимает на кнопку поиска.кнопка.

Экран пользовательского интерфейса:

Emp ID: _____________

Страна: __________

                 Search button        Cancel button

Данные поступают изтаблица «Сотрудник» в базе данных Oracle.

Таблица сотрудников:

Emp_id ---- Имя ----- Номер телефона ------ Страна

1 ---- Джон Смит ---- US-765-234-4567 --- США

2 ---- Сэм Бенигал ----AL-978-346-765 --- Аргентина

3 ---- Марк Тейлор ---- AS-987-3987-857 --- Австралия

4 ----Claire Furner --- CA-85-454-5454 --- Канада

Для второго фильтра мне нужно использовать номер телефона, который содержит данные, начинающиеся с кода страны ('US-765-234-4567 для страны США; AR-978-346-765 для аргентинской страны; AS-987-3987-857 дляr Страна Австралии ... и т. д.) и сопоставьте с входным параметром 'pt_country', чтобы получить результаты.Я использовал функцию Substring в этом сценарии, потому что на основе первых двух символов телефонного номера мне нужно получить результат.

Кроме того, входной параметр "pt_country" может иметь значение или может быть NULL.,

Код:

   Procedure search_emp (  pt_id        in     number,
                        pt_name       in     varchar2,
                        pt_country    in     varchar2,
                        empCursor    out    ref cursor)

as

    v_countrycode           CHAR(2);
    v_count                 NUMBER;
begin

    SELECT count(*) INTO v_count FROM r_country where UPPER(country) = UPPER(pt_country); 
    IF v_count > 0 THEN        
    SELECT countrycode INTO v_countrycode FROM r_country where UPPER(country) = UPPER(pt_country);            
    ELSE NULL; 
    END IF;  -- here, am trying to get the country code from the table for the input parameter 'pt_country' that is passed.

    open empCursor for
    select e.emp_id,
    e.name,
    e.phone_number           
    from employee e
    where upper(e.emp_id)    = upper(pt_emp_id)
    and   (UPPER(substr(e.phone_number,1,2)) LIKE UPPER(v_countrycode) or pt_country IS NULL);

--- I'm not sure how to get the results when the User gives a value to the input parameter  'pt_country'.
END;

Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Используйте один запрос для достижения результата следующим образом:

Select e.emp_id,
    e.name,
    e.phone_number           
from employee e
Join r_country c 
  On (e.phone_number like c.countrycode || '-%')
Where upper(e.emp_id)    = upper(pt_emp_id)
  And UPPER(c.country) = UPPER(COALESCE(pt_country, c.COUNTRY))

Cheers !!

0 голосов
/ 26 сентября 2019

Попробуйте эту процедуру ниже, необходимо определить курсор как SYS_REFCURSOR, чтобы получить вывод

   create or replace Procedure search_emp (  pt_emp_id        in     number,
                        pt_name       in     varchar2,
                        pt_country    in     varchar2,
                        empCursor    out    SYS_REFCURSOR)

as

    v_countrycode           CHAR(2);
    v_count                 NUMBER;
begin

    SELECT count(*) INTO v_count FROM r_country where UPPER(country) = UPPER(pt_country); 
    IF v_count > 0 THEN        
    SELECT countrycode INTO v_countrycode FROM r_country where UPPER(country) = UPPER(pt_country);            
    ELSE NULL; 
    END IF;  -- here, am trying to get the country code from the table for the input parameter 'pt_country' that is passed.

    open empCursor for
    select e.emp_id,
    e.name,
    e.phone_number           
    from employee e
    where upper(e.emp_id)    = upper(pt_emp_id)
    and   (UPPER(substr(e.phone_number,1,2)) LIKE UPPER(v_countrycode) or pt_country IS NULL);

--- I'm not sure how to get the results when the User gives a value to the input parameter  'pt_country'.
END;
...