给定此表:
create table test (
name text primary key
);
我需要编写一个plpgsql函数,其变量名与主键名冲突,必须在on conflict
子句中使用该主键名:
create or replace function func(
name text -- this variable name...
) returns void language plpgsql as
$$
begin
insert into test (name) values (name)
on conflict (name) do update -- ...conflicts with this line
set name = func.name;
end;
$$;
这将进行编译,但随后会抛出一个含糊的列引用:
select * from func('one');
ERROR: column reference "name" is ambiguous
LINE 2: on conflict (name) do update
^
DETAIL: It could refer to either a PL/pgSQL variable or a table column.
QUERY: insert into test (name) values (name)
on conflict (name) do update
set name = func.name
CONTEXT: PL/pgSQL function func(text) line 3 at SQL statement
我尝试将完整的列名指定为on conflict (test.name)
不编译,或((test.name))
不编译:
create or replace function func(
name text
) returns void language plpgsql as
$$
begin
insert into test (name) values (name)
on conflict ((test.name)) do -- this fails too
update set name = func.name;
end;
$$;
但是它也失败了:
select * from func('two');
ERROR: invalid reference to FROM-clause entry for table "test"
LINE 2: on conflict ((test.name)) do
^
HINT: There is an entry for table "test", but it cannot be referenced from this part of the query.
QUERY: insert into test (name) values (name)
on conflict ((test.name)) do
update set name = func.name
CONTEXT: PL/pgSQL function func(text) line 3 at SQL statement
有解决方案吗?
编辑:我找到了一种解决方法:
on conflict on constraint test_pkey do update
test_pkey
表名加在哪里_pkey
。我不知道这有多可靠。我仍然想改为指定列名。
首先,name
对于变量和属性都是一个不好的名字。两者兼而有之时,代码将看起来不那么好。考虑到这一点,您可以在变量前加上标签块(例如在<<fn>>``), and set
variable_conflict`下面的示例中,以优先选择列名,请参见下面的代码:
t=# create or replace function func(
name text
) returns void language plpgsql as
$$
#variable_conflict use_column
<<fn>>
declare name text :='blah';
begin
insert into test (name) values (name)
on conflict (name) do -- this no longer fails
update set name = fn.name;
end;
$$;
t=# insert into test select 'b';
INSERT 0 1
Time: 8.076 ms
t=# select func('b');
func
------
(1 row)
Time: 6.117 ms
t=# select * from test;
name
------
b
blah
(2 rows)
https://www.postgresql.org/docs/current/static/plpgsql-
implementation.html#PLPGSQL-VAR-
SUBST
默认情况下,如果SQL语句中的名称可以引用变量或表列,则PL / pgSQL将报告错误。您可以通过重命名变量或列,限定不明确的引用或告诉PL /
pgSQL首选哪种解释来解决此问题。
进一步-基本上整个链接都与此有关。
然而,在演示了如何使用plpgsql轻松完成特定任务之后,我仍然引用namual:
最简单的解决方案是重命名变量或列。常见的编码规则是对PL /
pgSQL变量使用与对列名不同的命名约定。例如,如果您一致地命名函数变量v_something,而您的列名都不以v_开头,则不会发生冲突。
问题内容: 我正在使用R来调用mySQL语句,其中我在语句外定义了变量,例如 但这会返回一个空集,我已经在Google周围搜索并尝试了“。&foo”。“ .foo。” ‘。&& foo。’‘和许多不同的组合,但是它们都不起作用,我认为这应该是mysql问题,而不是我遇到的R特定问题,但不确定。通常,变量具有$值,但R中没有。 问题答案: 这应该工作:
问题内容: 我想声明一个服务器名称,并在插入语句中使用该名称。到目前为止,我得到的只是一条错误消息。 这给了我: 问题答案: 我之前遇到过这个问题,发现的唯一解决方法是动态sql
问题内容: 我需要有关SQL逻辑的帮助,并且我已经(在研究中)进行了2天的工作,但获得了零成功。 我的目标是尝试将变量从ASP页传递到存储过程,该过程将变量用作where子句中列名称的条件。 因此,例如(我的查询的简化版本): 存储过程确实执行,但是它不返回任何值,而且我知道它会将@strDept视为文字nvarchar而不是列名。 所以我想我的问题是,如何使SQL Server 2005将@sq
问题内容: 我需要帮助为具有较长实际名称的变量选择适当的名称。我已经阅读了pep8文档,但找不到解决此类问题的方法。 您将重命名为类似名称还是将其保留原样。我注意到库中构建的python的名称非常短,如果这种情况存在,我想遵循约定。 我知道我可以给它起一个不太具描述性的名称,并添加描述,这可以解释其含义,但是您认为变量名称应该是什么。 问题答案: PEP8建议使用简短的变量名,但是要做到这一点需要
问题内容: 有没有办法在运行时(从代码中)知道变量的名称?还是在编译过程中忘记了变量的名称(是否使用字节码)? 例如: 注意 :我说的是普通数据类型的变量(,,等) 问题答案: 这里是一个基本的(也许很奇怪)函数,它显示了参数的名称…这个想法是分析代码并搜索对该函数的调用(在 init 方法中添加它可以帮助找到实例名称,尽管带有一个更复杂的代码分析) 请注意:如下面的示例所示,从调用代码中获取多行
问题内容: 嗨, 我有一个变量$ 1,其中包含逗号分隔的电子邮件地址,例如john @ example.com,pat @ example.com。我希望在类似where的子句中传递此变量 但是显然这行不通,我尝试了APEX_UTIL.STRING_TO_TABLE和DBMS_UTILITY.COMMA_TO_TABLE但徒劳。 任何帮助表示赞赏。 问题答案: 正如Pavanred所暗示的那样,最