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

h7appiyu  于 2023-01-13  发布在  PostgreSQL
关注(0)|答案(1)|浏览(251)

我正在尝试在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时:

CALL trans_buy('james', 3, 10)

我收到此错误消息:
不存在存储过程〈〈trans_buy(unknown,integer,integer)〉〉
提示:没有过程与参数的名称和类型匹配。可能需要添加显式类型转换。

kxkpmulp

kxkpmulp1#

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

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

我假设invoice_details中的目标列也是smallint,另一种方法是让该过程接受int s,并在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中并不需要使用子查询来完成这一操作,您可以使用common-table-expressions在一个查询中运行多个DML操作:

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

相关问题