powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция для присвоения уникального кода ордера
3 сообщений из 3, страница 1 из 1
Функция для присвоения уникального кода ордера
    #39385022
mstdmstd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет,

Написал небольшую функцию, для присвоения уникального кода ордера на основе кода пользователя, текущего дня и номера накладной за текущий день :
Код: 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.
CREATE OR REPLACE FUNCTION public.pd_get_ordernumber(p_user_id integer)
 RETURNS character varying -- user_id - 5 chars, CURRENT day - 8 chars, # FOR CURRENT day - 7 chars
 LANGUAGE plpgsql
AS $function$
DECLARE ret character varying;
DECLARE next_code character varying;
DECLARE i bigint;
DECLARE order_number_exists integer;
DECLARE ret_non_exists_roder integer;

  begin

	ret= concat( lpad( cast( p_user_id AS character varying ), 5, '0'), to_char(current_timestamp,  'YYYYMMDD') );
	ret_non_exists_roder= 0;
	i = 1;
	order_number_exists= 1;
	WHILE ( i< 9999999 AND ret_non_exists_roder = 0 ) LOOP

	   next_code= concat( ret, lpad( cast( i AS character varying ), 7, '0') );

	   SELECT count("id") INTO order_number_exists FROM pd_order WHERE order_number = next_code LIMIT 1;

	   IF order_number_exists = 0 THEN
		  ret_non_exists_roder= i;
	   END IF;

	   i = i+1;

	END LOOP;

	IF ret_non_exists_roder > 0 THEN
	  RETURN concat( ret, lpad( cast( ret_non_exists_roder AS character varying ), 7, '0') );
	END IF;

	RETURN '';
  end
$function$

Она работает, но возник вопрос а есть ли вероятность ошибки из-за дублирования этого кода(в базе поле уникально)
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
		$this->db->trans_start();
				...
		$OrderId = $this->morder->UpdateOrder(0, $update_data );
		if ($OrderId) {
			if ($this->db->trans_status() === FALSE) {
				$this->db->trans_rollback();
			} else {
				$this->db->trans_commit();
			}


Зависит ли это от настроек PostgreSQL, codeigniter ?
PostgreSQL 9.4.10 , codeigniter 3.1.0(3.1.0, ENVIRONMENT = development )

2) И нет ли в PostgreSQL более удобного для подобной задачи ?

Спасибо!
...
Рейтинг: 0 / 0
Функция для присвоения уникального кода ордера
    #39385059
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mstdmstd,

не вникал . обычно задачи такого рода решают созданием таблички достигнутых значений (по одной строке на задачу "о конкурентном ресурсе"), к которым (строкам) все конкуренты встают в очередь на уникъю. работа замедляется, но номера идут сплошняком без дырок. в порядке коммитов.

в пж такие таблички (конкурентных ресурсов) источник проблем (ибо пухнут индексами) -- их надо периодически реиндексировать. и всячески избегать долгих транзакций с ними -- чтобы они приемлемо (авто)вакуумировались.

если значений внутри задачи мало (мало ордеров внутри периода в вашем случае) -- можно просто преодолевать исключения на уникъю навариванием значения (без отдельной таблички достигнутых со строкой на каждый период).


если дырки допустимы -- сиквенсы вам в помощь.
...
Рейтинг: 0 / 0
Функция для присвоения уникального кода ордера
    #39385241
mstdmstd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С таблицей идея понятна

С sequence - это https://www.postgresql.org/docs/9.5/static/sql-createsequence.html ?
Как их прикрутить к задаче, поскольку мне нужно группировать по коду юзеру и дате. sequence Такое позволяет?
В доке я не нашел такое делать...
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция для присвоения уникального кода ордера
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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