Oracle - PL SQL выбора из SYS_REFCURSOR - PullRequest
4 голосов
/ 04 апреля 2010

У меня есть функция, которая возвращает SYS_REFCURSOR, который имеет одну строку, но несколько столбцов. Я хочу иметь возможность иметь SQL-запрос, который имеет вложенные подзапросы, используя значения столбцов, возвращаемые в SYS_REFCURSOR. Были бы оценены альтернативные идеи, такие как типы, и т. Д. Код ниже написан мной на лету и не проверен на синтаксис.

--Oracle function
CREATE DummyFunction(dummyValue AS NUMBER) RETURN SYS_REFCURSOR
IS
  RETURN_DATA SYS_REFCURSOR;
BEGIN
  OPEN RETURN_DATA
  SELECT
    TO_CHAR(dummyValue) || 'A' AS ColumnA
    ,TO_CHAR(dummyValue) || 'B' AS ColumnB
  FROM
    DUAL;

  RETURN RETURN_DATA;
END;

--sample query with sub-queries; does not work
SELECT
  SELECT ColumnA FROM DummyFunction(1) FROM DUAL AS ColumnA
  ,SELECT ColumnB FROM DummyFunction(1) FROM DUAL AS ColumnB
FROM
  DUAL;

1 Ответ

5 голосов
/ 05 апреля 2010

SYS_REFCURSOR не будет работать по назначению - вам нужно создать тип Oracle:

CREATE TYPE your_type IS OBJECT (
  ColumnA VARCHAR2(100),
  ColumnB VARCHAR2(100)
)

Обновите вашу функцию:

CREATE DummyFunction(dummyValue AS NUMBER) 
RETURN your_type
IS

BEGIN

  INSERT INTO your_type
  SELECT TO_CHAR(dummyValue) || 'A' AS ColumnA,
         TO_CHAR(dummyValue) || 'B' AS ColumnB
    FROM DUAL;

  RETURN your_type;

END;

Тогда вы можете использовать:

SELECT (SELECT ColumnA FROM table(DummyFunction(1))) AS ColumnA, 
       (SELECT ColumnB FROM table(DummyFunction(1))) AS ColumnB
  FROM DUAL

Пример слишком сложен - все, что вам нужно использовать:

SELECT x.columna,
       x.columnb
  FROM table(DummyFunction(1)) x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...