#sql #oracle #plsql
Есть обычная функция: CREATE OR REPLACE FUNCTION ISFUNC(ID IN NUMBER) RETURN VARCHAR2 IS BEGIN IF (ID = 2 OR ID = 5) THEN RETURN('TRUE'); ELSE RETURN('FALSE'); END IF; END ISFUNC; / Суть ее вроде бы понятна. Как в нее можно вставить SELECT? Т.е. чтобы в IF были не конкретные числа, а результат селекта? Пусть, например, есть такой SELECT: SELECT id FROM Table Результатом этого селекта являются две строки: 2 и 5. Как правильно вставить этот SELECT в функцию? Пытался в сам IF, но понял, что не правильно.
Ответы
Ответ 1
Попробуйте так: CREATE OR REPLACE FUNCTION ISFUNC(ID IN NUMBER) RETURN VARCHAR2 IS l_exst number; BEGIN SELECT count(*) INTO l_exst FROM Table t WHERE t.id = ID; IF (l_exst <> 0) THEN RETURN('TRUE'); ELSE RETURN('FALSE'); END IF; END ISFUNC; / или CREATE OR REPLACE FUNCTION ISFUNC(ID IN NUMBER) RETURN VARCHAR2 IS BEGIN FOR x IN ( SELECT ID FROM Table ) LOOP IF (ID = x.ID) THEN RETURN('TRUE'); END IF; END LOOP; RETURN('FALSE'); END ISFUNC; /Ответ 2
Еще один вариант решения данной задачи: SQL> create table tab(id number); Table created SQL> insert into tab values (2); 1 row inserted SQL> insert into tab values (5); 1 row inserted SQL> select * from tab; ID ---------- 2 5 SQL> CREATE OR REPLACE FUNCTION ISFUNC(pID IN NUMBER) RETURN VARCHAR2 2 IS 3 result varchar2(5); 4 BEGIN 5 select decode(count(*),0,'FALSE','TRUE') into result 6 from tab 7 where tab.id=pid; 8 return(result); 9 END ISFUNC; 10 / SQL> select level, isfunc(level) from dual connect by level<=10; LEVEL ISFUNC(LEVEL) ---------- -------------------------------------------------------------------------------- 1 FALSE 2 TRUE 3 FALSE 4 FALSE 5 TRUE 6 FALSE 7 FALSE 8 FALSE 9 FALSE 10 FALSE 10 rows selectedОтвет 3
Можно объявить переменную @count и выполнить запрос: select @count = count(*) from Table where id in (2, 5) А затем проверить количество строк: if (@count > 0) P.S. Синтаксиса PL/SQL уже не помню, но неточности подправите сами, если что.
Комментариев нет:
Отправить комментарий