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
。另一种方法是让过程接受 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 中并不真正需要子查询来执行此操作。您可以在单个查询中 运行 多个 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
我正在尝试使用 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
。另一种方法是让过程接受 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 中并不真正需要子查询来执行此操作。您可以在单个查询中 运行 多个 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