Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Создание piplined функции / 2 сообщений из 2, страница 1 из 1
12.04.2021, 21:27
    #40061839
007alex3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание piplined функции
Доброго времени суток.
Прошу помочь с созданием piplined функции.
Таблица содержит следующие данные:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with t as (
select 123456 DRAW_KEY, 1 WINCAT_NUM,0 WIN_AMOUNT,0 WIN_COUNT
from dual
union all
select 123456 DRAW_KEY, 2 WINCAT_NUM,0 WIN_AMOUNT,0 WIN_COUNT
from dual
union all
select 123456 DRAW_KEY, 3 WINCAT_NUM,0 WIN_AMOUNT,0 WIN_COUNT
from dual
union all
select 123456 DRAW_KEY, 4 WINCAT_NUM,30000 WIN_AMOUNT,12 WIN_COUNT
from dual
union all
select 123456 DRAW_KEY, 5 WINCAT_NUM,6000 WIN_AMOUNT,73 WIN_COUNT
from dual
)
select *
from t



На основе этих данных создаю функцию:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
CREATE TYPE l_result AS OBJECT (
 DRAW_KEY number,
  WINCAT_NUM  number,
  WIN_AMOUNT number,
  WIN_COUNT number
);
/

CREATE TYPE table_pip IS TABLE OF l_result;


CREATE OR REPLACE FUNCTION MyFunction1(v_draw_key in number) RETURN table_pip Pipelined IS
v_query clob;
v_cols clob;
BEGIN
select listagg(wincat_num ,', ') within group (order by wincat_num)
into v_cols
from customers1
where draw_key = 123456; --v_draw_key!
v_query := '
SELECT * FROM
(
select draw_key,wincat_num,win_amount,win_count
from customers1
where draw_key = 123456
)
PIVOT
(
sum(win_count) as win_count,sum(win_amount) as win_amount
FOR wincat_num IN ('||v_cols||')
)';
EXECUTE IMMEDIATE v_query into l_result;

pipe row(l_result);
END;



Но в строке
Код: plsql
1.
CREATE OR REPLACE FUNCTION MyFunction1(v_draw_key in number) RETURN table_pip Pipelined IS

выдает ошибки PLS-00321: expression 'L_RESULT' is inappropriate as the left hand side of an assignment statement и PLS-00306: wrong number or types of arguments in call to 'L_RESULT'.
Что я написал не так, подскажите, пожалуйста?
...
Рейтинг: 0 / 0
13.04.2021, 04:29
    #40061882
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание piplined функции
007alex3

Что я написал не так, подскажите, пожалуйста?


Все. Начнем с того что l_result это тип, т.е. это то же как ты бы написал:

Код: plsql
1.
EXECUTE IMMEDIATE 'SELECT SAL FROM EMP' INTO NUMBER;



T.e. нужно определить переменную типа l_result и указать эту переменную а не тип. Далее:

Код: plsql
1.
2.
3.
4.
select listagg(wincat_num ,', ') within group (order by wincat_num)
into v_cols
from customers1
where draw_key = 123456; --v_draw_key!



вернет список из переменного числа элементов равного числу строк в customers1 где draw_key = 123456, скажем N элементов. Посему мы не знаем сколько полей вернет pivot - все что мы знаем это то что pivot вернет draw_key + (win_count,win_amount) * N. Так что имеем pivot возвращает переменное число полей а тип l_result фиксированное число полей тем более что pivot возвращает нечетное число полей а тип l_result четное (4 поля). Но это позже, а пока в твоем INTO только одна переменная (и не важно что объектного типа). Чтобы это работало SELECT * необходимо переписать SELECT чтобы он возвращал одно поле: SELECT l_result(col1,col2,...) где col1, col2, ... имена полей возвращаемых pivot. Вобщем как я и сказал - код в топку.

SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Создание piplined функции / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]