如果我不符合“公众”的资格。在account_category表中, out account_category 将与account_category表名冲突。
是否“公开”。还适用于其他rdbms?
CREATE OR REPLACE FUNCTION X_RAIN(x VARCHAR, OUT user_id VARCHAR, out account_category varchar, out depth int) returns setof record
AS
$$
BEGIN
return query
select uar.account_id, c.account_category, c.depth
from account_with_types_chart_of_account uar
inner join public.account_category c using(account_category_id);
END;
$$ LANGUAGE 'plpgsql';
答案 0 :(得分:2)
Public是默认架构名称。
例如,在MySQL中,它没有架构(如果我记得)。此外,如果您使用其他架构而不是公共架构,则代码将会中断。
http://www.postgresql.org/docs/8.3/interactive/ddl-schemas.html
我建议使用另一个变量名。可能还有另一种方式。
答案 1 :(得分:2)
关于PostgreSQL中的public,当没有指定模式名称时,public被定义为默认模式名称。但是,这可以在search_path = xxx行的postgresql.conf文件中更改。要查看当前的默认架构设置为发出以下SQL命令:
SHOW_ search_path;
如果要在打开的查询会话中更改默认架构路径,请发出以下SQL命令:
SET search_path = new_path;
但是,在您发布的示例中,我认为您遇到问题的命名冲突不是使用架构名称,而是使用函数参数名称 account_category和表名account_category。您可以重命名参数名称以避免此冲突。在具有许多模式的数据库中,为了清楚起见,我经常在数据库对象名称的开头明确指定public。
关于你的第二个问题,我不认为PostgreSQL在使用public方面是独一无二的,但我知道许多其他数据库以不同的方式执行它们的模式。
答案 2 :(得分:0)
发生冲突是因为您为变量和表名使用了相同的名称。
这是一个非常糟糕的命名选择,可能会导致很多问题。
例如:
create function x (somename TEXT) returns bool as $$
declare
tempbool int4;
begin
select true INTO tempbool from some_table where somename = somename;
return tempbool;
end;
$$ language plpgsql;
这段代码基本上没有任何意义,因为解析器无法分辨“somename = somename”的含义。表名也是如此(在某种程度上)。
通常,您希望标识符(表名,列名,变量名)是唯一的。
我更喜欢为参数使用“in_”前缀,但您选择的命名模式可能会有所不同。