Алгоритм поиска при возврате нулевых значений в PL/SQL.

Ivan Shomnikov
Дата: 02.08.2005 11:10:09
Помогите с алгоритмом.
Нужно искать в таблице однофамильцев и выбирать их ID в переменную.
Сам делал это функцией:
FUNCTION f_similar
(Director VARCHAR2,
code_estab INTEGER) RETURN INT IS
similar_id INTEGER;
BEGIN
similar_id := 1;
SELECT p.ID INTO similar_id
FROM tb_Employee emp INNER JOIN tb_People p ON p.ID = emp.id_people
INNER JOIN tb_establishment e ON e.ID = emp.ID_establishment
WHERE Director in (SELECT Lastname||' '||Firstname||' '||Patronymic FROM tb_people)
AND e.external_code = code_estab;

RETURN similar_id;

END f_similar;

Потом в процедуре просто пытался присвоить переменной значение функции.
При выполнении процедуры Oracle выдает:
ORA-01403: Данных не найдено
Ссылаясь на SELECT.
Просто думаю, что мой алгоритм в корне неверен для PL/SQL.
Надеюсь на помощь.
Apex
Дата: 02.08.2005 11:13:31
Ivan Shomnikov
Помогите с алгоритмом.
Нужно искать в таблице однофамильцев и выбирать их ID в переменную.
Сам делал это функцией:
FUNCTION f_similar
(Director VARCHAR2,
code_estab INTEGER) RETURN INT IS
similar_id INTEGER;
BEGIN
similar_id := 1;
SELECT p.ID INTO similar_id
FROM tb_Employee emp INNER JOIN tb_People p ON p.ID = emp.id_people
INNER JOIN tb_establishment e ON e.ID = emp.ID_establishment
WHERE Director in (SELECT Lastname||' '||Firstname||' '||Patronymic FROM tb_people)
AND e.external_code = code_estab;

RETURN similar_id;

END f_similar;

Потом в процедуре просто пытался присвоить переменной значение функции.
При выполнении процедуры Oracle выдает:
ORA-01403: Данных не найдено
Ссылаясь на SELECT.
Просто думаю, что мой алгоритм в корне неверен для PL/SQL.
Надеюсь на помощь.

Ну ты бы описание ошибки в доке глянул или по форуму поискал... У тя селект ниче не вернул, вот и вспупыжил эксепшн.
Vint
Дата: 02.08.2005 11:14:00
Может и неверн просто у вас после select ... into similar_id
в переменной similar_id получаеться нулл
поставьте там проверку на nodatafound либо на ошибку запрос возвращяет более одной строки может вам и поможет и поищите по форуму тут достаточно часто подобный вопрос поднимаеться
Vadim_Maximov
Дата: 02.08.2005 11:18:03
1. Какой ID вы вернете в случае, если однофамильцев несколько?
2. Какой ID вы вернете в случае, если однофамильцев нет?
3. Зачем функция, когда это можно сделать одним запросом?

SQL> create table emp(id number, lastname varchar2(30));

Table created.

SQL> insert into emp values(1, 'Pupkin');

1 row created.

SQL> insert into emp values(2, 'Petrov');

1 row created.

SQL> insert into emp values(3, 'Ivanov');

1 row created.

SQL> insert into emp values(4,  'Vasechkin');

1 row created.

SQL> insert into emp values(4,  'Pupkin');

1 row created.

SQL> insert into emp values(5,  'Pupkin');

1 row created.

SQL>  insert into emp values(6, 'Petrov');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from emp;

        ID LASTNAME
---------- ------------------------------
         1 Pupkin
         2 Petrov
         3 Ivanov
         4 Vasechkin
         4 Pupkin
         5 Pupkin
         6 Petrov

7 rows selected.

SQL> select * 
  2  from   (select id, 
  3                 lastname,
  4                 count(*) over(partition by lastname) q
  5          from   emp) q
  6  where  q.q > 1;

        ID LASTNAME                                Q
---------- ------------------------------ ----------
         2 Petrov                                  2
         6 Petrov                                  2
         1 Pupkin                                  3
         5 Pupkin                                  3
         4 Pupkin                                  3

SQL>
XCB
Дата: 02.08.2005 11:18:31
Обрабатывай NO_DATA_FOUND и TOO_MANY_ROW
Ivan Shomnikov
Дата: 02.08.2005 11:39:12
WHEN NO_DATA_FOUND почему-то не давал результата. Возможно я где-то ошибся.
Спасибо за подсказки.
Ivan Shomnikov
Дата: 02.08.2005 12:32:35
to Vadim_Maximov:
Очень любопытен ваш вариант.
простите не понял конструкции over(partition by lastname). Если нетрудно, то поясните, пожалуйста.
А будет ли работать это, если я не просто ищу однофамильцев в определенной таблице, а ищу их по условию. Как изменится данная конструкция, если запрос получает условие выборки из параметров.
Apex
Дата: 02.08.2005 12:52:22
Ivan Shomnikov

простите не понял конструкции over(partition by lastname).

Это аналитическая функция