当前位置: 首页 > 面试题库 >

函数调用的属性符号给出错误

杜绍元
2023-03-14
问题内容

当前模式与功能之一不同时,属性表示法函数调用会出错。

我创建了一个函数

CREATE FUNCTION pub.FullName(pub.reps)
  RETURNS text AS
$func$
       select ($1.fname || ' ' || $1.lname)
$func$ LANGUAGE SQL;

我正在尝试使用docs中描述的带有属性符号的函数:

select r.fullname from pub.reps r;

但是收到一条错误消息:

ERROR:  column "fullname" does not exist

使用功能符号的查询可以正常工作:

select pub.fullname(r.*) from pub.reps r;

数据库已通过备份/还原从PostgreSQL 10迁移。

Select version() 给出: PostgreSQL 11.3, compiled by Visual C++ build 1914, 64-bit

UPD 。发现如果我将pub架构设置为默认值,则select r.fullname from pub.reps r可以正常工作。


问题答案:

您自己找到了问题的根源。确切地说:函数的模式pub必须在current中的 任何位置 列出 search_path
,而不必是“默认”或“当前”模式(列表中的第一个)。有关的:

  • search_path如何影响标识符解析和“当前模式”

因此Postgres找不到该功能。在这方面,Postgres 11与Postgres 10并无不同。但是,还有一些值得注意的相关发展。您提到:

数据库已通过备份/还原从PostgreSQL 10迁移。

考虑一下Postgres
11发行说明中
指出的这一细微变化:

  • 在对函数和列引用进行歧义消除时,请考虑语法形式(Tom Lane)

x 是表名或组合列时,PostgreSQL传统上将语法形式考虑为等价形式, f(x) 并且
x.f

允许使用诸如写函数然后将其当作按需计算列之类的技巧。但是,如果两种解释都是可行的,则始终选择列解释,如果用户打算使用函数解释,则会导致令人惊讶的结果。现在,如果存在歧义,则选择与句法形式匹配的解释。

因此, 如果fullname表中有一列reps
并且还pub.fullname(pub.reps)显示了功能,则即使使用功能符号,Postgres 10仍会选择该

SELECT fullname(r) FROM reps r;  -- resolves to column if it exists, ignoring function

db
<>在此处

拨弄 Postgres 10

Postgres 11(更合理地)选择功能:

db
<>在此处

拨弄 Postgres 11

Postgres 12
(当前为beta)最终实现了真正生成的列。发行说明:

  • 添加对生成的列的支持(Peter Eisentraut)

生成的列的内容是根据表达式(包括对同一表中其他列的引用)计算得出的,而不是由INSERTUPDATE命令指定的。

不过,只有 STORED 生成的列才包含在此发行版中。(更有趣的IMO) VIRTUAL
变体被推迟到以后的版本中。(尚未在Postgres
13中使用。)

您的表可能如下所示:

CREATE TABLE pub.reps (
  reps_id  int GENERATED ALWAYS AS IDENTITY PRIMARY KEY 
, fname    text NOT NULL
, lname    text NOT NULL
, fullname text GENERATED ALWAYS AS (fname || ' ' || lname) STORED
);

db
<>在这里拨弄

我声明了fnamelnameNOT NULL。否则,您的简单串联(fname || ' ' || lname)是一个陷阱。看:

  • 如何串联Postgres SELECT中的列?
  • 合并两列并添加到新列中


 类似资料:
  • 问题内容: 我正在使用Python编写一些加密算法,但是我以前从未使用过Python。 首先,看一下这段代码,然后我将解释这个问题, x和y的值为, 我不明白代码的第三行。为了理解第三行,我不得不研究函数,我遇到了这个问题, zip函数帮助元组 根据这个问题的答案,代码, 将输出, 但是当我尝试打印时, 我得到这个输出, 为什么我的输出与原始输出不同? 问题答案: 在Python 3中返回一个迭代

  • 当我使用put操作将数据对象插入aws firhose流时,它工作正常。由于在我的fire hose流上启用了lambda函数。因此调用了lambda函数,但给了我一个输出结构响应错误: 所以现在我已经创建了我的lambda函数,这样可以做出正确的输出结构: 现在,我得到了以下关于将“数据”字段编码为 如果我将“hello”更改为b“hello”之类的字节,则会出现以下错误:

  • 我正在使用springboot和gradle,我正在尝试在控制器中执行下面的代码。 在编译时,我得到以下错误 错误:找不到symbol=List.of(“水星”,“金星”,“地球”,“火星”,^symbol:方法of(String,String,String,String,String,String,String,String,String,String) 位置:接口列表 我的分级档案 sourc

  • 我想要做的是保存一个新的变体,但在保存时,它会对String上的成员函数get_name()抛出一个错误调用;正在创建变体,但没有任何属性值。 通过的数据是: 是product_id

  • 在下面的查询中,我使用了strftime函数来获取字符串格式的日期。它在sqlite数据库中运行良好。但是,当数据库更改为进程时,它抛出了一个错误,即“SQLSTATE[42883]:未定义函数:7错误:函数strftime(未知,没有时区的时间戳)不存在” 下面的代码在SQLite中工作,但在Postgres数据库中引发了一个错误

  • 问题内容: 考虑以下示例。 如果我尝试更改类实例的变量,则编译成功。 但是,如果我尝试更改method 的返回值,则编译会发出尖叫 有人可以解释一下。 问题答案: 这是编译器告诉您的修改无用的方式。 这是发生了什么:当你打电话,一个 副本 的回传给你。该副本是 临时的 。您可以检查其字段,或将其分配给变量(在这种情况下,您将能够重新访问您的修改)。如果编译器允许您对该临时结构进行修改,则将无法访问