Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Создание таблицы из JSON со спец символами \u0000 / 6 сообщений из 6, страница 1 из 1
25.02.2022, 10:32
    #40136345
Создание таблицы из JSON со спец символами \u0000
Коллеги, добрый день! Подскажите, пожалуйста, может быть кто то сталкивался, не получается создать таблицу из данных JSON.

Есть процедура которая создает таблицу, на входе JSON который содержит несколько значений полей и массив строк, в процедуре должно произойти соединение полей с каждым элементом массива, ниже текст процедуры

Код: 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.
CREATE OR REPLACE FUNCTION public.mt_insert_marking_codes(
	v_data_json jsonb)
    RETURNS text
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
table_id text;
sql_text text;
marking_codes_array text;
BEGIN
table_id := v_data_json::json->>'order_id';
marking_codes_array:= v_data_json::json->>'codes';
marking_codes_array := replace(marking_codes_array, '''', '''''');
--marking_codes_array := replace(marking_codes_array, '', '\');
v_data_json:= v_data_json::jsonb - 'codes';
 sql_text := 'Create TABLE "'||table_id||'" AS
 				Select * 
 				from 
 					jsonb_to_record('''||v_data_json||''') AS v_goods_id(expireddate text, order_id text)
 				CROSS JOIN
 					jsonb_array_elements_text('''||marking_codes_array||''') AS v_marking_codes';


EXECUTE sql_text;	

Return marking_codes_array;
END;



Данные которые подаются на вход, в примере массив "codes" содержит 1 элемент, на практике будет до 150 000 элементов

Код: plsql
1.
2.
SELECT MT_INSERT_MARKING_CODES('{"expireddate":123, "order_id": "4f847231-7190-4cc7-9fba-ce6c7e9f167f",
codes": ["0113111111111258215,VutIJ7PGj8=''CbRro0\u001D91FFD0\u001D92dGVzdD03+4LS7S2z/QXp9FBGiR9lP4mmzVVmBgd3kgE="]}')



При выполнении процедуры получаю ошибку

ERROR: invalid input syntax for type json
LINE 1: SELECT MT_INSERT_MARKING_CODES('{"expireddate":123,
^
DETAIL: Character with value 0x1d must be escaped.
CONTEXT: JSON data, line 3: ..."codes": ["0113111111111258215,VutIJ7PGj8='CbRro0...
SQL state: 22P02
Character: 32

Ошибка ругается на символ \u001D, пробовал вы полнить INSERT "0113111111111258215,VutIJ7PGj8=''CbRro0\u001D91FFD0\u001D92dGVzdD03+4LS7S2z/QXp9FBGiR9lP4mmzVVmBgd3kgE=" базу то проходит норм..., предполагаю, что это как то связано с обработкой JSON, но не могу понять что нужно исправить
...
Рейтинг: 0 / 0
25.02.2022, 16:28
    #40136452
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблицы из JSON со спец символами \u0000
Андрей Моторико

DETAIL: Character with value 0x1d must be escaped.

И что в этой ошибке не понятно?

Андрей Моторико

...
jsonb_to_record('''||v_data_json||''') AS v_goods_id(expireddate text, order_id text)
...
jsonb_array_elements_text('''||marking_codes_array||''') AS v_marking_codes';
...

Что это за порнография?
PostgreSQL знаю плохо, но неужели в нем нет bind-переменных?
...
Рейтинг: 0 / 0
25.02.2022, 16:34
    #40136453
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблицы из JSON со спец символами \u0000
Смотрю в документацию (не уверен, что на нужный раздел) - bind переменные вижу.
Какой код написали - так он и работает.

https://postgrespro.ru/docs/postgresql/9.6/sql-prepare
https://postgrespro.ru/docs/postgresql/9.6/sql-execute
...
Рейтинг: 0 / 0
26.02.2022, 09:58
    #40136499
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблицы из JSON со спец символами \u0000
Андрей Моторико,

Код: plsql
1.
2.
SELECT MT_INSERT_MARKING_CODES('{"expireddate":123, "order_id": "4f847231-7190-4cc7-9fba-ce6c7e9f167f",
codes": ["0113111111111258215,VutIJ7PGj8=''CbRro0\u001D91FFD0\u001D92dGVzdD03+4LS7S2z/QXp9FBGiR9lP4mmzVVmBgd3kgE="]}')



Здесь у Вас пропущена двойная кавычка перед codes. Есть вопросы к архитектуре, создавать по отдельной таблице - это по мне расточительство.

Так работает

Код: 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.
CREATE OR REPLACE FUNCTION public.mt_insert_marking_codes(
	v_data_json jsonb)
    RETURNS text
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
table_id text;
sql_text text;
marking_codes_array jsonb;
BEGIN
table_id := v_data_json::json->>'order_id';
marking_codes_array:= v_data_json::json->'codes';
v_data_json:= v_data_json::jsonb - 'codes';
 sql_text := format('Create TABLE %I AS
 				Select * 
 				from 
 					jsonb_to_record($1) AS v_goods_id(expireddate text, order_id text)
 				CROSS JOIN
 					jsonb_array_elements_text($2) AS v_marking_codes', table_id);

EXECUTE sql_text using v_data_json, marking_codes_array;	

Return marking_codes_array;
END;
$BODY$;

SELECT MT_INSERT_MARKING_CODES('{"expireddate":123, "order_id": "4f847231-7190-4cc7-9fba-ce6c7e9f167f",
"codes": ["0113111111111258215,VutIJ7PGj8=''CbRro0\u001D91FFD0\u001D92dGVzdD03+4LS7S2z/QXp9FBGiR9lP4mmzVVmBgd3kgE="]}')


...
Рейтинг: 0 / 0
28.02.2022, 10:15
    #40136657
Создание таблицы из JSON со спец символами \u0000
Swa111, спасибо! Попробую и отпишусь. Это отладочный скрипт, в проде должно быть так
Код: plsql
1.
Create TEMP TABLE "'||table_id||'"  ON COMMIT DROP AS....
...
Рейтинг: 0 / 0
28.02.2022, 14:01
    #40136690
Создание таблицы из JSON со спец символами \u0000
Swa111, кажется получилось! Спасибо огромное! Не подумал про использование формата, а про подстановку параметров в execute не знал.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Создание таблицы из JSON со спец символами \u0000 / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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