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

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

27.06.2025, 19:31. Показов 1040. Ответов 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
Сообщений: 83
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
 Аватар для Дядя Виля
42 / 34 / 9
Регистрация: 12.06.2024
Сообщений: 168
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
Сообщений: 810
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
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru