使用uuid作为输入参数之一的复合类型数组调用postgresql存储过程
Call postgresql stored procedure with composite type array with uuid as one of the input parameters
我有以下用户定义的复合类型
CREATE TYPE item AS (
SKU_REFERENCE_ID uuid,
QUANTITY INTEGER
);
并且我将它用作 postgresql 存储过程的输入参数的一部分(仅显示存储过程的相关部分)
CREATE OR REPLACE PROCEDURE "dbo"."sp_bulk_update_customer_cart" (IN USER_NAME VARCHAR(20), IN CUSTOMER_ITEMS item[], INOUT QUANTITY INTEGER)
但是,我无法调用程序。
以下是我尝试过但都失败的一些方法:
尝试 1:
CALL dbo.sp_bulk_update_customer_cart(
'username',
(ARRAY['(e3903331-ce0b-4bd5-a853-ec7aa725a812, 20)','(ccbecc39-11bd-4bc4-97d6-7e2f981d30dd, 40)'])::item[],
0
);
尝试 2:
CALL dbo.sp_bulk_update_customer_cart(
'username',
'{"(e3903331-ce0b-4bd5-a853-ec7aa725a812, 20)","(ccbecc39-11bd-4bc4-97d6-7e2f981d30dd, 40)"}'::item[],
0
);
尝试 3:
CALL dbo.sp_bulk_update_customer_cart(
'username',
(SELECT ARRAY[ROW('e3903331-ce0b-4bd5-a853-ec7aa725a812', 20),ROW('ccbecc39-11bd-4bc4-97d6-7e2f981d30dd', 40)]::item[]),
0
);
我遇到的最常见错误是
ERROR: invalid input syntax for type uuid:
"(e3903331-ce0b-4bd5-a853-ec7aa725a812,20)" CONTEXT: PL/pgSQL
function dbo.sp_bulk_update_customer_cart(character
varying,item[],integer) line 17 at FOR over SELECT rows SQL state:
22P02
在此寻求帮助。
Using AWS RDS postgres engine version: 13.3
测试脚本:
DROP PROCEDURE IF EXISTS "dbo"."sp_test_script";
--Not really required as temp tables are deleted after the session ends.
DROP TABLE IF EXISTS item_table;
DROP TYPE IF EXISTS item;
CREATE TYPE item AS (SKU_REFERENCE_ID uuid, QUANTITY integer);
CREATE OR REPLACE PROCEDURE "dbo"."sp_test_script" (IN USER_NAME VARCHAR(20), IN CUSTOMER_ITEMS item[], INOUT QUANTITY INTEGER)
LANGUAGE PLPGSQL
AS $$
BEGIN
CREATE TEMP TABLE item_table (
id SERIAL PRIMARY KEY NOT NULL,
SKU_REFERENCE_ID uuid,
QUANTITY integer
);
DECLARE b item;
BEGIN
FOR b IN SELECT UNNEST(customer_items)
LOOP
RAISE NOTICE 'b.sku_reference_id: %', b.sku_reference_id;
RAISE NOTICE 'b.quantity: %', b.quantity;
INSERT INTO item_table(SKU_REFERENCE_ID, QUANTITY) VALUES(b.sku_reference_id, b.quantity);
END LOOP;
END;
END; $$;
您的脚本在对数组进行迭代时出现问题 - FOR b IN SELECT UNNEST(customer_items)
中存在错误。此语法不执行记录的解包,但 FOR IN SELECT
语句需要它。你需要写:
FOR b IN SELECT * FROM unnest(customer_items)
LOOP
...
或(更好)
FOREACH b IN ARRAY customer_items
LOOP
...
我有以下用户定义的复合类型
CREATE TYPE item AS (
SKU_REFERENCE_ID uuid,
QUANTITY INTEGER
);
并且我将它用作 postgresql 存储过程的输入参数的一部分(仅显示存储过程的相关部分)
CREATE OR REPLACE PROCEDURE "dbo"."sp_bulk_update_customer_cart" (IN USER_NAME VARCHAR(20), IN CUSTOMER_ITEMS item[], INOUT QUANTITY INTEGER)
但是,我无法调用程序。 以下是我尝试过但都失败的一些方法:
尝试 1:
CALL dbo.sp_bulk_update_customer_cart(
'username',
(ARRAY['(e3903331-ce0b-4bd5-a853-ec7aa725a812, 20)','(ccbecc39-11bd-4bc4-97d6-7e2f981d30dd, 40)'])::item[],
0
);
尝试 2:
CALL dbo.sp_bulk_update_customer_cart(
'username',
'{"(e3903331-ce0b-4bd5-a853-ec7aa725a812, 20)","(ccbecc39-11bd-4bc4-97d6-7e2f981d30dd, 40)"}'::item[],
0
);
尝试 3:
CALL dbo.sp_bulk_update_customer_cart(
'username',
(SELECT ARRAY[ROW('e3903331-ce0b-4bd5-a853-ec7aa725a812', 20),ROW('ccbecc39-11bd-4bc4-97d6-7e2f981d30dd', 40)]::item[]),
0
);
我遇到的最常见错误是
ERROR: invalid input syntax for type uuid: "(e3903331-ce0b-4bd5-a853-ec7aa725a812,20)" CONTEXT: PL/pgSQL function dbo.sp_bulk_update_customer_cart(character varying,item[],integer) line 17 at FOR over SELECT rows SQL state: 22P02
在此寻求帮助。
Using AWS RDS postgres engine version: 13.3
测试脚本:
DROP PROCEDURE IF EXISTS "dbo"."sp_test_script";
--Not really required as temp tables are deleted after the session ends.
DROP TABLE IF EXISTS item_table;
DROP TYPE IF EXISTS item;
CREATE TYPE item AS (SKU_REFERENCE_ID uuid, QUANTITY integer);
CREATE OR REPLACE PROCEDURE "dbo"."sp_test_script" (IN USER_NAME VARCHAR(20), IN CUSTOMER_ITEMS item[], INOUT QUANTITY INTEGER)
LANGUAGE PLPGSQL
AS $$
BEGIN
CREATE TEMP TABLE item_table (
id SERIAL PRIMARY KEY NOT NULL,
SKU_REFERENCE_ID uuid,
QUANTITY integer
);
DECLARE b item;
BEGIN
FOR b IN SELECT UNNEST(customer_items)
LOOP
RAISE NOTICE 'b.sku_reference_id: %', b.sku_reference_id;
RAISE NOTICE 'b.quantity: %', b.quantity;
INSERT INTO item_table(SKU_REFERENCE_ID, QUANTITY) VALUES(b.sku_reference_id, b.quantity);
END LOOP;
END;
END; $$;
您的脚本在对数组进行迭代时出现问题 - FOR b IN SELECT UNNEST(customer_items)
中存在错误。此语法不执行记录的解包,但 FOR IN SELECT
语句需要它。你需要写:
FOR b IN SELECT * FROM unnest(customer_items)
LOOP
...
或(更好)
FOREACH b IN ARRAY customer_items
LOOP
...