powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / PIPELINE функция
10 сообщений из 10, страница 1 из 1
PIPELINE функция
    #40087268
diagirl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Только начинаю изучать SQL и возник следующий вопрос. Написала PIPELINE функцию, все скомпилировалось без ошибок, но когда делаю SELECT, получаю пустую таблицу. Подскажите, что я делаю не так или может есть какой-то вариант сделать это без PIPELINE?

Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
CREATE OR REPLACE TYPE record_cred AS OBJECT
    (n_dog NUMBER,
    name_client VARCHAR2(80),
    begin_date DATE,
    end_date DATE,
    rest_debt NUMBER,
    percents NUMBER);

CREATE OR REPLACE TYPE table_cred AS TABLE OF record_cred;

create FUNCTION credit_portpholio (end_date IN DATE) RETURN table_cred pipelined
    AS
    BEGIN
        for t_cred in (
        SELECT pr_cred.num_dog AS n_dog,
            client.cl_name AS name_client,
            pr_cred.date_begin AS begin_date,
            pr_cred.date_end AS end_date,
            fact_rest.rest_debt AS rest_debt,
            (plan_percent.p_perсent - fact_percent.f_perсent) AS percents
        FROM pr_cred
        JOIN client ON pr_cred.id_client = client.id
        JOIN (SELECT collection_id, 
                    SUM(CASE type_oper
                            WHEN 'Выдача кредита' THEN fact_oper.f_summa
                            WHEN 'Погашение кредита' THEN -fact_oper.f_summa
                        END) AS rest_debt
            FROM fact_oper
            WHERE f_date <= end_date
            GROUP BY collection_id) fact_rest
        ON pr_cred.collect_fact = fact_rest.collection_id
        JOIN (SELECT collection_id,
                SUM(CASE type_oper
                        WHEN 'Погашение процентов' THEN plan_oper.p_summa
                    END) AS p_perсent
             FROM plan_oper
             WHERE p_date <= end_date
            GROUP BY collection_id) plan_percent
        ON pr_cred.collect_plan = plan_percent.collection_id
        JOIN (SELECT collection_id,
                SUM(CASE type_oper
                        WHEN 'Погашение процентов' THEN fact_oper.f_summa
                    END) AS f_perсent
              FROM fact_oper
              WHERE f_date <= end_date
              GROUP BY collection_id) fact_percent
        ON pr_cred.collect_fact = fact_percent.collection_id)
        LOOP
            pipe row (record_cred(t_cred.n_dog, t_cred.name_client, t_cred.begin_date,
                                    t_cred.end_date, t_cred.rest_debt, t_cred.percents));
        END LOOP;
End credit_portpholio;


SELECT * FROM TABLE(CREDIT_PORTPHOLIO('18.01.2020'));
...
Рейтинг: 0 / 0
PIPELINE функция
    #40087271
yens_gjytk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
diagirl,

Попробуйте для начала дату передать, как положено датам, например:
Код: plsql
1.
date '2020-01-18'
...
Рейтинг: 0 / 0
PIPELINE функция
    #40087288
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
diagirl,

добавте отладочную инфомацию в ф-цию

напр
...
LOOP
dbms_output.pu_line(t_cred.n_dog...
pipe row
...

и поймете что и куда

......
stax
...
Рейтинг: 0 / 0
PIPELINE функция
    #40087331
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый лучший способ - это отказаться от использования PIPELINE функции.
Бросайте уже эти "селекты из процедуры".
Тут вам не Microsoft SQL Server :-)

Код: 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.
        SELECT pr_cred.num_dog AS n_dog,
            client.cl_name AS name_client,
            pr_cred.date_begin AS begin_date,
            pr_cred.date_end AS end_date,
            fact_rest.rest_debt AS rest_debt,
            (plan_percent.p_perсent - fact_percent.f_perсent) AS percents
        FROM pr_cred
        JOIN client ON pr_cred.id_client = client.id
        JOIN (SELECT collection_id, 
                    SUM(CASE type_oper
                            WHEN 'Выдача кредита' THEN fact_oper.f_summa
                            WHEN 'Погашение кредита' THEN -fact_oper.f_summa
                        END) AS rest_debt
            FROM fact_oper
            WHERE f_date <= :end_date -- Задать значение Bind Variable в приложении 
            GROUP BY collection_id) fact_rest
        ON pr_cred.collect_fact = fact_rest.collection_id
        JOIN (SELECT collection_id,
                SUM(CASE type_oper
                        WHEN 'Погашение процентов' THEN plan_oper.p_summa
                    END) AS p_perсent
             FROM plan_oper
             WHERE p_date <= :end_date -- Задать значение Bind Variable в приложении
            GROUP BY collection_id) plan_percent
        ON pr_cred.collect_plan = plan_percent.collection_id
        JOIN (SELECT collection_id,
                SUM(CASE type_oper
                        WHEN 'Погашение процентов' THEN fact_oper.f_summa
                    END) AS f_perсent
              FROM fact_oper
              WHERE f_date <= end_date
              GROUP BY collection_id) fact_percent
        ON pr_cred.collect_fact = fact_percent.collection_id);
...
Рейтинг: 0 / 0
PIPELINE функция
    #40087960
diagirl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yens_gjytk,
Формат даты настроен именно такой, как указано
...
Рейтинг: 0 / 0
PIPELINE функция
    #40087963
diagirl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus, Но ведь у меня параметр end_date не постоянен, и тогда получает, что мне его каждый раз заново объявлять нужно
...
Рейтинг: 0 / 0
PIPELINE функция
    #40087973
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
diagirl,

Прочитайте, что такое bind переменная
...
Рейтинг: 0 / 0
PIPELINE функция
    #40087975
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
diagirl,

разницу между типами строки и даты понимаете?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
-- это строка
SELECT * FROM TABLE(CREDIT_PORTPHOLIO('18.01.2020'));

-- это дата
SELECT * FROM TABLE(CREDIT_PORTPHOLIO(DATE '18.01.2020'));
-- это тоже дата
SELECT * FROM TABLE(CREDIT_PORTPHOLIO(TO_DATE('18.01.2020','DD.MM.YYYY')));
...
Рейтинг: 0 / 0
PIPELINE функция
    #40088086
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Lejnin,

очепятка DATE '18.01.2020'

.....
stax
...
Рейтинг: 0 / 0
PIPELINE функция
    #40088144
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
Vadim Lejnin,

очепятка DATE '18.01.2020'

.....
stax



Вы совершенно правы, надо использовать ANSI формат

Datetime Literals

Дока -> SQL Language Reference -> Basic Elements of Oracle SQL -> LiteralsTo specify a DATE value as a literal, you must use the Gregorian calendar. You can specify an ANSI literal, as shown in this example:
Код: plsql
1.
date '2020-01-18'
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / PIPELINE функция
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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