Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

SELECT в хранимых функциях

#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 уже не помню, но неточности подправите сами, если что.

Комментариев нет:

Отправить комментарий