gpt4 book ai didi

postgresql - SQL 状态 : 42883 in PostgreSQL 9. 3

转载 作者:行者123 更新时间:2023-11-29 12:44:07 26 4
gpt4 key购买 nike

我有一个名为 test_type 的下表,其中包含两列,即 colacolb

:test_type

create table test_type
(
cola int,
colb varchar(50)
);

现在我想创建一个具有相同列的类型。

类型:type1

create type type1 as
(
cola int,
colb varchar(50)
);

我在这里创建了一个函数,我在其中传递类型名称 type1 以将数据插入到表 test_type

--创建函数

create or replace function fun_test ( p_Type type1 )
returns void
as
$$
begin
insert into test_type(cola,colb)
select cola,colb from p_type
EXCEPT
select cola,colb from test_type;
end
$$
language plpgsql;

---调用函数

SELECT fun_test(1,'Xyz');

错误详情:

ERROR: function fun_test(integer, unknown) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Character: 8

最佳答案

您需要将参数“打包”在一起:(1,'xs'),以便 postgres 将它们识别为类型 1 的单个参数:

SELECT fun_test((1,'xs')); 

为了更好的可读性,您可以将参数转换为 type1(并非真正必要):

SELECT fun_test((1,'xs')::type1);

如果该函数的目的是仅当值尚未包含在表中时才插入值,您可以这样更改代码:

create or replace function fun_test ( p_Type type1 )
returns void AS $$
BEGIN
INSERT INTO test_type(cola,colb)
SELECT p_Type.cola,p_Type.colb
EXCEPT
SELECT cola,colb FROM test_type;
END;
$$ language plpgsql;

但我认为这种语法可读性不好。这个语句看起来更好:

...
BEGIN
PERFORM 0 FROM test_type WHERE (cola, colb) = p_Type;
IF NOT FOUND THEN
INSERT INTO test_type(cola,colb) VALUES (p_Type.cola,p_Type.colb);
END IF;
END;
...

关于postgresql - SQL 状态 : 42883 in PostgreSQL 9. 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34217221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com