powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Создание таблицы из JSON со спец символами \u0000
6 сообщений из 6, страница 1 из 1
Создание таблицы из JSON со спец символами \u0000
    #40136345
Коллеги, добрый день! Подскажите, пожалуйста, может быть кто то сталкивался, не получается создать таблицу из данных 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
Создание таблицы из JSON со спец символами \u0000
    #40136452
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Моторико

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
Создание таблицы из JSON со спец символами \u0000
    #40136453
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрю в документацию (не уверен, что на нужный раздел) - bind переменные вижу.
Какой код написали - так он и работает.

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

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


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