【问题标题】:Call postgresql stored procedure with composite type array with uuid as one of the input parameters使用 uuid 作为输入参数之一的复合类型数组调用 postgresql 存储过程
【发布时间】:2021-10-28 07:28:09
【问题描述】:

我有以下用户定义的复合类型

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(字符 Varying,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; $$;

【问题讨论】:

  • 我可以使用表 [] 来正确获取输入参数,而不是像 dba.stackexchange.com/questions/131505/… 那样使用复合类型的数组。但是,根据我的原始问题使用类型时找到正确的输入参数会很有帮助。

标签: stored-procedures plpgsql


【解决方案1】:

您在数组迭代中的脚本问题 - 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
  ...

【讨论】:

  • 我尝试了类似的语法,但总是得到这样的结果:错误:uuid 类型的输入语法无效:“(e3903331-ce0b-4bd5-a853-ec7aa725a812,10)”
  • 两列(sky_reference_id 和数量一起读取。要调试发送的内容,请参阅:NOTICE:b.sku_reference_id:(e3903331-ce0b-4bd5-a853-ec7aa725a812,10)NOTICE:b。数量:
  • @CODI - 请附上我可以测试的脚本。
  • 不建议附加脚本,所以我用测试脚本更新了我的问题。
  • @CODI - 现在我在办公室,我更改了回复,并解决了您的问题
猜你喜欢
  • 2013-10-15
  • 1970-01-01
  • 2018-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多