stored-procedures - 使用 uuid 作为输入参数之一的复合类型数组调用 postgresql 存储过程
问题描述
我有以下用户定义的复合类型
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
);
我得到的最常见的错误是
错误:uuid 类型的输入语法无效:“(e3903331-ce0b-4bd5-a853-ec7aa725a812,20)” 上下文:PL/pgSQL 函数 dbo.sp_bulk_update_customer_cart(字符变化,item[],integer)第 17 行 FOR over SELECT 行SQL状态:22P02
在这里寻求帮助。
使用 AWS RDS postgres 引擎版本: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
...
推荐阅读
- ios - 为什么共享视频只发送到其他一些应用程序?
- android - 使用带有旋转的android中的画布创建一个有4个段的圆
- sql - 子查询会降低查询性能
- javascript - self.registration.getNotifications() 在 firebase-messaging-sw 中返回一个空数组
- java - 如何使用带参数的自定义注释查找 CDI bean?
- c++ - 在 C++ 中使用 D 和 E 表示法有什么区别?
- sqlite - 数据库中的目标行
- excel - 数据透视表 - 将付款合并为一个
- ffmpeg - 使用ffmpeg将两个通道转换为左或右的单个通道
- javascript - 单击提交按钮时如何更改数组的值而不清除之前所做的更改?