Использовать вывод Oracle SQL Function в условии WHERE SQL-запроса - PullRequest
0 голосов
/ 23 ноября 2018

Я написал функцию Oracle SQL, которая будет возвращать идентификаторы EMP в следующем формате.

Query: select CUSFNC_GETEMPID('HIGH-RATED') from dual;

Output: ('1436','1444','1234')

Я хочу использовать этот вывод в запросе SQL следующим образом:

SELECT ID, NAME, SAL
FROM EMP
WHERE ID IN CUSFNC_GETEMPID('HIGH-RATED')

IЯ ожидаю, что этот запрос возвращает записи с идентификаторами, равными значениям, упомянутым в приведенном выше запросе.

Но он не работает должным образом.

Как этого добиться, изменив вывод функции или любым другим способом?

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Вы можете использовать PIPELINED TABLE FUNCTION, например:

CREATE FUNCTION CUSFNC_GETEMPID(param1 varchar2) RETURN DBMSOUTPUT_LINESARRAY PIPELINED AS 
BEGIN
  FOR a_row IN 
  (
    -- YOUR SQL WHICH RETURNS ROWS WITH ID VALUES HERE...
    SELECT id
    FROM 
    (
      SELECT '1' id, 'HIGH-RATED' col FROM dual UNION 
      SELECT '2' id, 'HIGH-RATED' col FROM dual UNION 
      SELECT '3' id, 'LOW-RATED'  col FROM dual 
    )
    WHERE col = param1 -- FILTER BASED ON INPUT PARAM...
  )
  LOOP

    PIPE ROW(a_row.id); -- PUT THE ID COLUMN HERE...

  END LOOP;
END;
/

, а затем вызвать его в своем SQL как:

SELECT ID, NAME, SAL
FROM EMP
WHERE ID IN (SELECT column_value FROM TABLE(CUSFNC_GETEMPID('HIGH-RATED')))
0 голосов
/ 24 ноября 2018

ВЫБЕРИТЕ ID, ИМЯ, ПРОДАЖУ ИЗ EMP, ГДЕ ИДЕНТИФИКАТОР (ВЫБЕРИТЕ CUSFNC_GETEMPID (ВЫСОКО-РЕЙТИНГОВЫЙ) КАК ИДЕНТИФИКАТОР ИЗ ДВОЙНЫХ)

0 голосов
/ 23 ноября 2018

Вы можете использовать объединение вместо предложения IN

    SELECT ID, NAME, SAL
    FROM EMP
    inner join  (
        select CUSFNC_GETEMPID('HIGH-RATED') hrated from dual;
    ) t on t.hrated  = emp.id

, и ваш emp.id может быть числом, поэтому вам следует преобразовать его в char

    SELECT ID, NAME, SAL
    FROM EMP
    inner join  (
        select CUSFNC_GETEMPID('HIGH-RATED') hrated from dual;
    ) t on t.hrated  = to_char(emp.id)
...