PostgreSQL - 如何使用 varchar 参数调用过程

PostgreSQL - How call a procedure with a varchar parameter

我正在尝试使用 postgresql 12 做一个 SP

CREATE OR REPLACE PROCEDURE trans_buy(
        _name_client varchar(25),
        _id_product smallint,
        _mount smallint
    )
    LANGUAGE plpgsql
    AS
    $$

    BEGIN 
        INSERT INTO invoices (cliente) VALUES(_name_client);
        INSERT INTO invoices_details (id_invoice, id_product, mount) VALUES (1, _id_product, _mount, 100);
    END
    $$

但是当我尝试使用以下方式调用此 sp 时: 呼叫 trans_buy('james', 3, 10) 我收到此消息错误:

不存在存储过程<< trans_buy(未知,整数,整数)>>

提示:没有过程与参数的名称和类型匹配。可能需要添加显式类型转换。

您可能需要将整数值显式转换为 smallint:

call trans_buy('james', 3::smallint, 10::smallint);

我假设 invoice_details 中的目标列也是 smallint。另一种方法是让过程接受 ints,并在 insert 时间投射:

CREATE OR REPLACE PROCEDURE trans_buy(
    _name_client varchar(25),
    _id_product int,
    _mount int
) LANGUAGE plpgsql
AS $$
BEGIN 
    INSERT INTO invoices (cliente) VALUES(_name_client);
    INSERT INTO invoices_details (id_invoice, id_product, mount) VALUES (1, _id_product::smallint, _mount::smallint);
END
$$

请注意,您的第二个插入有 3 列的 4 个值。我(试图)调整那个。


还应强调您在 Postgres 中并不真正需要子查询来执行此操作。您可以在单个查询中 运行 多个 DML 操作,使用 common-tabe-expressions:

with 
    -- CTE: query parameters
    params(cliente, id_product, mount) as (values ('james', 3, 10)),
    
    -- CTE: insert to invoices
    inv as (insert into invoices (cliente) select cliente from params)

-- insert to invoice details
insert into invoice_details (id_invoice, id_product, mount) 
select 1, id_product, mount from params