Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 1
Регистрация: 27.06.2013
Сообщений: 88

Как поправить функцию

27.06.2025, 19:31. Показов 988. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Подскажите, мне пожалуйста, как мне поправить код функции чтобы он заработал. Ранее программировала под MSSQL и там знаю как писать функции. Но вот в PostgreeSQL оказалось что синтаксис такой не принимается.. В интернете смотрела как пишутся функции. Как-то сложно там сделано... Но вот свою не могу никак подправить чтобы она скомпилироватьсь СУБД.
Вот код моей функции:
SQL
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
CREATE FUNCTION getGrade(app_name text, employee_id text, department_id text, category_id INTEGER) RETURNS TEXT
AS $$
BEGIN
  
  DECLARE grade text = '';
 
IF employee_id != '' THEN
  SELECT grade = e.grade FROM public.program_marks_by_employees e
  WHERE e.app_name = app_name AND e.employee_id = employee_id
  
  IF grade != '' THEN
    RETURN grade;
      
  SELECT grade = dep.grade FROM public.program_marks_by_departments dep
  WHERE dep.app_name = app_name AND dep.department_id = department_id
 
 IF grade != '' THEN
    RETURN grade;
 
  SELECT grade = c.grade FROM public.categories c
  WHERE c.id = category_id
 
  RETURN grade;
END;
$$ LANGUAGE plpgsql;
Я получаю такую вот ошибку:


Почему ругается на if ? Я заметила что если уберу строчку с объявлением переменной grade то на этот if не ругается.
Как мне правильно тогда объявить переменную ?
Подскажите, мне пожалуйста, как мне всю эту функцию оформить в корректный sql код для postgree.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.06.2025, 19:31
Ответы с готовыми решениями:

Как поправить *.CSV
Доброго времени суток! Возможно не в тот раздел, но вдруг) Имеется csv файл метаданных. Массив...

Как поправить заголовок в таблице
Привет всем. Есть запрос такого вида: select...

Как поправить запрос?
Здравствуйте, помогите с запросом пожалуйста: select * from sc84 as nom join sc319 as p on...

5
0 / 0 / 1
Регистрация: 27.06.2013
Сообщений: 88
27.06.2025, 20:13  [ТС]
код поправила.
SQL
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
CREATE OR REPLACE FUNCTION get_grade(appname text, employeeid text, departmentid text, category_id INTEGER) RETURNS TEXT
AS $$
 
  DECLARE mygrade text = '';
BEGIN
  
IF employeeid != '' THEN
  PERFORM  mygrade = e.grade FROM public.program_marks_by_employees e
  WHERE e.app_name = appname AND e.employee_id = employeeid;
 END IF; 
 
  IF mygrade != '' THEN
    RETURN mygrade;
  END IF;
      
  PERFORM  mygrade = dep.grade FROM public.program_marks_by_departments dep
  WHERE dep.app_name = appname AND dep.department_id = departmentid;
 
 IF mygrade != '' THEN
    RETURN mygrade;
 END IF;
 
  PERFORM  mygrade = c.grade FROM public.categories c
  WHERE c.id = category_id;
 
  RETURN mygrade;
END;
$$ LANGUAGE plpgsql;
но он не отрабатывает как надо... возвращает пустую строку, хотя в таблице у меня есть подходящие данные.
0
74 / 18 / 6
Регистрация: 18.01.2025
Сообщений: 82
28.06.2025, 05:13
SQL
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
CREATE OR REPLACE FUNCTION get_grade(appname text, employeeid text, departmentid text, category_id INTEGER) RETURNS TEXT
AS $$
DECLARE 
    mygrade text := '';
BEGIN
    IF employeeid IS NOT NULL AND employeeid != '' THEN
        SELECT e.grade INTO mygrade 
        FROM public.program_marks_by_employees e
        WHERE e.app_name = appname AND e.employee_id = employeeid;
    END IF; 
 
    IF mygrade IS NOT NULL AND mygrade != '' THEN
        RETURN mygrade;
    END IF;
    
    IF departmentid IS NOT NULL AND departmentid != '' THEN
        SELECT dep.grade INTO mygrade 
        FROM public.program_marks_by_departments dep
        WHERE dep.app_name = appname AND dep.department_id = departmentid;
    END IF;
 
    IF mygrade IS NOT NULL AND mygrade != '' THEN
        RETURN mygrade;
    END IF;
 
    SELECT c.grade INTO mygrade 
    FROM public.categories c
    WHERE c.id = category_id;
 
    RETURN COALESCE(mygrade, '');
END;
$$ LANGUAGE plpgsql;
0
0 / 0 / 1
Регистрация: 27.06.2013
Сообщений: 88
30.06.2025, 13:23  [ТС]
благодарю за ответ! Могли бы вы мне ещё раз подсказать, пожалуйста. Я написала другую функцию, которая должна мне возвращать json, но при вызове функции получаю ошибку:
SQL
1
2
3
4
5
ERROR:  query has no destination FOR RESULT DATA
HINT:  IF you want TO discard the results OF a SELECT, USE PERFORM instead.
CONTEXT:  PL/pgSQL FUNCTION central.get_dapartment_tree() line 4 at SQL statement 
 
SQL state: 42601
Как мне поправить код ?
Вот мой код:
SQL
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
CREATE OR REPLACE FUNCTION central.get_dapartment_tree() RETURNS json
AS $$
BEGIN
 
WITH block10 AS (
WITH RECURSIVE
    pc AS
    (
        SELECT id, parent_id, 0 level FROM central.organization_department WHERE parent_id IS NULL
        UNION ALL
        SELECT c.id, p.id, level + 1
        FROM pc p JOIN central.organization_department c ON c.parent_id = p.id
    ),
    cp AS
    (
        SELECT  id,  parent_id, MAX(level) + 1 level, NULL::jsonb me FROM pc
        GROUP BY id, parent_id
        UNION ALL
        SELECT * FROM
        (
            WITH
                c AS
                (
                    SELECT DISTINCT
                        level,
                        parent_id,
                        ARRAY_AGG(me) OVER (PARTITION BY parent_id) children
                    FROM cp
                ),
                newlevel AS (SELECT MAX(level) - 1 level FROM c)
            SELECT
                p.*,
                jsonb_build_object('departmentId', d.id, 'departmentName', d.name, 'children', c.children)
                - CASE WHEN c.parent_id IS NULL THEN 'children' ELSE 'nothing' END
            FROM newlevel l JOIN pc p ON p.level = l.level JOIN central.organization_department d USING (id)
            LEFT JOIN c ON c.parent_id = p.id
        ) x
    )
SELECT me FROM cp WHERE level = 0
)
SELECT json_build_object('departments', (SELECT * FROM block10)) FROM block10;
END;
$$ LANGUAGE plpgsql;
Добавлено через 25 минут
Попробовала такой вариант:
SQL
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
CREATE OR REPLACE FUNCTION central.get_dapartment_tree() RETURNS SETOF jsonb
AS $$
 
DECLARE json jsonb;
BEGIN
 
WITH block10 AS (
WITH RECURSIVE
    pc AS
    (
        SELECT id, parent_id, 0 level FROM central.organization_department WHERE parent_id IS NULL
        UNION ALL
        SELECT c.id, p.id, level + 1
        FROM pc p JOIN central.organization_department c ON c.parent_id = p.id
    ),
    cp AS
    (
        SELECT  id,  parent_id, MAX(level) + 1 level, NULL::jsonb me FROM pc
        GROUP BY id, parent_id
        UNION ALL
        SELECT * FROM
        (
            WITH
                c AS
                (
                    SELECT DISTINCT
                        level,
                        parent_id,
                        ARRAY_AGG(me) OVER (PARTITION BY parent_id) children
                    FROM cp
                ),
                newlevel AS (SELECT MAX(level) - 1 level FROM c)
            SELECT
                p.*,
                jsonb_build_object('departmentId', d.id, 'departmentName', d.name, 'children', c.children)
                - CASE WHEN c.parent_id IS NULL THEN 'children' ELSE 'nothing' END
            FROM newlevel l JOIN pc p ON p.level = l.level JOIN central.organization_department d USING (id)
            LEFT JOIN c ON c.parent_id = p.id
        ) x
    )
SELECT me FROM cp WHERE level = 0
)
SELECT json = jsonb_build_object('departments', (SELECT * FROM block10)) FROM block10;
RETURN query SELECT json;
END;
$$ LANGUAGE plpgsql;
код успешно компилируется, функция создаётся. Но при вызове функции получаю всю ту же ошибку...
Вот вызов функции:
select * from central.get_dapartment_tree()
Пишет мне следущую ошибку:
SQL
1
2
3
4
5
ERROR:  query has no destination FOR RESULT DATA
HINT:  IF you want TO discard the results OF a SELECT, USE PERFORM instead.
CONTEXT:  PL/pgSQL FUNCTION central.get_dapartment_tree() line 6 at SQL statement 
 
SQL state: 42601
Никак не могу победить это... Подскажите мне, пожалуйста, как мне вернуть мой json из функции ?
0
 Аватар для Дядя Виля
40 / 33 / 8
Регистрация: 12.06.2024
Сообщений: 161
30.06.2025, 14:48
попробуйте создать свой тип и в него выводить результат...
например как-то так:
SQL
1
2
3
4
CREATE TYPE my_json AS
(
result_json jsonb
);
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 804
02.07.2025, 15:19
tiny developer, Запрос бредовый конечно, но так будет выводить данные

SQL
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
CREATE OR REPLACE FUNCTION central.get_dapartment_tree() RETURNS SETOF jsonb
AS $$
 
BEGIN
 
RETURN query 
WITH block10 AS (
WITH RECURSIVE
    pc AS
    (
        SELECT id, parent_id, 0 level FROM central.organization_department WHERE parent_id IS NULL
        UNION ALL
        SELECT c.id, p.id, level + 1
        FROM pc p JOIN central.organization_department c ON c.parent_id = p.id
    ),
    cp AS
    (
        SELECT  id,  parent_id, MAX(level) + 1 level, NULL::jsonb me FROM pc
        GROUP BY id, parent_id
        UNION ALL
        SELECT * FROM
        (
            WITH
                c AS
                (
                    SELECT DISTINCT
                        level,
                        parent_id,
                        ARRAY_AGG(me) OVER (PARTITION BY parent_id) children
                    FROM cp
                ),
                newlevel AS (SELECT MAX(level) - 1 level FROM c)
            SELECT
                p.*,
                jsonb_build_object('departmentId', d.id, 'departmentName', d.name, 'children', c.children)
                - CASE WHEN c.parent_id IS NULL THEN 'children' ELSE 'nothing' END
            FROM newlevel l JOIN pc p ON p.level = l.level JOIN central.organization_department d USING (id)
            LEFT JOIN c ON c.parent_id = p.id
        ) x
    )
SELECT me FROM cp WHERE level = 0
)
SELECT jsonb_build_object('departments', (SELECT array_agg(me) FROM block10));
END;
$$ LANGUAGE plpgsql;

если же нужно только одно значение

SQL
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
CREATE OR REPLACE FUNCTION central.get_dapartment_tree() RETURNS  jsonb
AS $$
 
DECLARE jvResult jsonb;
BEGIN
 
WITH block10 AS (
WITH RECURSIVE
    pc AS
    (
        SELECT id, parent_id, 0 level FROM central.organization_department WHERE parent_id IS NULL
        UNION ALL
        SELECT c.id, p.id, level + 1
        FROM pc p JOIN central.organization_department c ON c.parent_id = p.id
    ),
    cp AS
    (
        SELECT  id,  parent_id, MAX(level) + 1 level, NULL::jsonb me FROM pc
        GROUP BY id, parent_id
        UNION ALL
        SELECT * FROM
        (
            WITH
                c AS
                (
                    SELECT DISTINCT
                        level,
                        parent_id,
                        ARRAY_AGG(me) OVER (PARTITION BY parent_id) children
                    FROM cp
                ),
                newlevel AS (SELECT MAX(level) - 1 level FROM c)
            SELECT
                p.*,
                jsonb_build_object('departmentId', d.id, 'departmentName', d.name, 'children', c.children)
                - CASE WHEN c.parent_id IS NULL THEN 'children' ELSE 'nothing' END
            FROM newlevel l JOIN pc p ON p.level = l.level JOIN central.organization_department d USING (id)
            LEFT JOIN c ON c.parent_id = p.id
        ) x
    )
SELECT me FROM cp WHERE level = 0
)
SELECT jsonb_build_object('departments', (SELECT array_agg(me) FROM block10)) INTO jvResult;
 
RETURN jvResult;
END;
$$ LANGUAGE plpgsql;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.07.2025, 15:19
Помогаю со студенческими работами здесь

Перенос даты при слиянии в Ворд не в нашей (ДД.ММ.ГГГГ), а в US(UK) формате (М/ДД/ГГГГ), как поправить?
Уважаемые Форумчане! доброго времени суток!:help: при слиянии из базы Аксесс в Ворд в поле дата...

Insert Как поправить значение перед insert
Есть таблица с numeric (5.2) полем. Сторонний ехе-шник в нее пишет и не всегда значение влезает....

Прошу помочь поправить запрос
Доброго времени суток! Ситауция такая, есть запрос Select a.DRIVER_ID, A.MED_CERTIF_NUM,...

Поправить запрос
Доброе время суток. Есть проблема, я только начал изучать vba и у меня возник вопрос с запросом на...

Поправить формы
Здравствуйте! В аттаче база данных "продажа авиабилетов". Прошу поправить формы (диспетчер и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru