powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция в PG правильно ли сделал?
9 сообщений из 9, страница 1 из 1
Функция в PG правильно ли сделал?
    #38625918
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня. Интересует мнение по поводу моей функции.
Правильно ли сделана? (она работает)
Что и как можно было бы сделать по другому?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE FUNCTION NTD(integer,integer,integer) RETURNS text AS ' 
BEGIN
If $1 IS NOT null Then If $2 IS NOT null Then If (SELECT id FROM cup_ntd WHERE id_name=$1 AND id_detail=$2) IS NOT null Then
UPDATE cup_ntd SET vis=$3 WHERE id_name=$1 AND id_detail=$2; return 1;
else INSERT INTO cup_ntd (id_name, id_detail, vis) VALUES ($1, $2, $3); return 2;
end if;
end if;
end if;
end;
' LANGUAGE plpgsql;



Если в таблице нет нужного значения то функция вставляет Insert а если есть обновляет.
...
Рейтинг: 0 / 0
Функция в PG правильно ли сделал?
    #38626393
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
...
Рейтинг: 0 / 0
Функция в PG правильно ли сделал?
    #38626419
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это моя первая функция на PG.
То что есть в справке частично читал, но так как тут новичок я еще не знаю всю гибкость.
Поэтому и спрашивал.
...
Рейтинг: 0 / 0
Функция в PG правильно ли сделал?
    #38626431
fte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМНО: Так изящнее:)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE FUNCTION NTD(integer,integer,integer) RETURNS text AS
$$
BEGIN
    UPDATE cup_ntd SET vis=$3 WHERE id_name=$1 AND id_detail=$2;
    IF (FOUND) THEN
         RETURN '1';
    ELSE
         INSERT INTO cup_ntd (id_name, id_detail, vis) VALUES ($1, $2, $3);
         RETURN '2';
    END IF;
END;
$$ 
LANGUAGE plpgsql;



crauseIF $1 IS NOT null Then If $2 IS NOT null


A вот так делать не надо, это делается в определении таблицы

create table cup_ntd (id_name integer NOT NULL, id_detail integer NOT NULL ,......)
...
Рейтинг: 0 / 0
Функция в PG правильно ли сделал?
    #38626446
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fteТак изящнее:)

Я так понимаю
$$ - заменят ''
if (FOUND) Then - положительно только для операции сделанной выше т.е. UPDATE...

Между THEN и ELSE а также ELSE и END
можно писать сколько угодно кода, и это будет считаться одним блоком!!! Верно утверждение?

А могут ли в этом коде быть костыли какие-то?
Огромное спасибо за подсказку.
...
Рейтинг: 0 / 0
Функция в PG правильно ли сделал?
    #38626470
biwed.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crause,
Добрый день.
crauseЕсли в таблице нет нужного значения то функция вставляет Insert а если есть обновляет.
В других СУБД эта функция называется Merge. Ее можно и на PostgreSQL написать через CTE. Ссылка на пример http://www.biwed.ru/index.php/dobryaki/16-sql/36-obnovlenie-zapisej-tablicy-izmerenij-pri-pomoshhi-cte

С уважением,
biwed.ru
...
Рейтинг: 0 / 0
Функция в PG правильно ли сделал?
    #38626507
fte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crause$$ - заменят ''

Да

crauseif (FOUND) Then - положительно только для операции сделанной выше т.е. UPDATE...

Нет - положительно, когда обновится хотя бы одна запись

crauseМежду THEN и ELSE а также ELSE и END
можно писать сколько угодно кода, и это будет считаться одним блоком!!! Верно утверждение?

Вам же дали ссылку, изучайте... там достаточно информации что-бы ответить на Ваш вопрос...

2+2 = 4
crauseА могут ли в этом коде быть костыли какие-то?

А что есть КОСТЫЛЬ ?????
...
Рейтинг: 0 / 0
Функция в PG правильно ли сделал?
    #38627548
Dim666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fte,

в вашем коде "костыль" (возможная проблема и т.д.) это например ситуация, когда между update и insert какая-нибудь другая транзакция сделает insert для таких же (id_name, id_detail). В результате у вас либо получится две разные записи в таблице, либо exception, если по этим двум столбцам стоит констрейн на уникальность.
...
Рейтинг: 0 / 0
Функция в PG правильно ли сделал?
    #38628201
drsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция в PG правильно ли сделал?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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