, поэтому я работаю над проектом, который требует, чтобы мой запрос был вставлен в одну основную таблицу и его таблицу подробностей (которая будет отправлена в БД в виде списка) в одной транзакции, чтобы он откатывался, если одиниз функций вставки не удалось.
Допустим, у меня есть эти таблицы:
CREATE TABLE transaction(
id BIGSERIAL PRIMARY KEY NOT NULL,
user_id BIGINT FOREIGN KEY NOT NULL,
total_item INT NOT NULL DEFAULT 0,
total_purchase BIGINT NOT NULL DEFAULT 0
)
CREATE TABLE transaction_detail(
id BIGSERIAL PRIMARY KEY NOT NULL,
transaction_id BIGINT FOREIGN KEY NOT NULL,
product_id BIGINT FOREIGN KEY NOT NULL,
product_price INT NOT NULL DEFAULT 0,
purchase_amount INT NOT NULL DEFAULT 0
)
И у меня есть эта функция:
CREATE OR REPLACE FUNCTION create_transaction(order JSONB, product_list JSONB)
Параметры функции:
order : An object which will be inserted into the transaction table
product_list : List of Product object which will be inserted into the transaction_detail table
Мой текущий запрос выглядит примерно так:
CREATE OR REPLACE FUNCTION insert_order(tx JSONB, product_list JSONB)
RETURNS BIGINT
AS $$
WITH result AS (
INSERT INTO transaction(
user_id,
total_item,
total_purchase,
) VALUES (
(tx ->> 'user_id') :: BIGINT,
(tx ->> 'total_item') :: INT,
(tx ->> 'total_purchase') :: INT,
)
RETURNING id AS transaction_id
)
FOR row IN product_list LOOP
INSERT INTO transaction_detail(
transaction_id,
product_id,
product_price,
purchase_amount,
) VALUES (
transaction_id,
(row ->> 'product_id') :: BIGINT,
(row ->> 'product_price') :: INT,
(row ->> 'purchase_amount') :: INT,
)
END LOOP;
$$ LANGUAGE SQL SECURITY DEFINER;
Файлы JSON:
[
"user_id" : "1",
"total_item" : "2",
"total_purchase" : "2000",
]
[
{
"product_id" : "1",
"product_price" : "500",
"purchase_amount" : "2"
},
{
"product_id" : "2",
"product_price" : "1000",
"purchase_amount" : "1"
}
]
Я знаю, что с моим запросом что-то не так, хотя я не могу понять, что с ним.Любой указатель высоко ценится.