栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

表名作为PostgreSQL函数参数

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

表名作为PostgreSQL函数参数

这可以进一步简化和改进:

CREATE OR REPLACe FUNCTION some_f(_tbl regclass, OUT result integer)    LANGUAGE plpgsql AS$func$BEGIN   EXECUTE format('SELECT (EXISTS (SELECT FROM %s WHERe id = 1))::int', _tbl)   INTO result;END$func$;

使用架构限定名称进行调用(请参见下文):

SELECt some_f('myschema.mytable');  -- would fail with quote_ident()

或者:

SELECT some_f('"my very uncommon table name"');

要点
使用OUT参数简化功能。您可以直接选择动态SQL的结果并完成。无需其他变量和代码。

EXISTS正是您想要的。您会得到true该行是否存在false。有多种方法可以做到这一点,EXISTS通常是最有效的。

您似乎想要返回一个整数,因此我将boolean结果从转换EXISTS为integer,得到的正是您所拥有的。我会返回布尔值。

我将对象标识符类型regclass用作的输入类型

_tbl
。那可以做所有
quote_ident(_tbl)
或format
('%I', _tbl)
可以做的事,但是更好,因为:

..它也可以防止SQL注入。

..如果表名无效/不存在/对当前用户不可见,它将立即失败,并且更正常地失败。(regclass参数仅适用于现有表。)

..它可与模式限定的表名配合使用,在这些表名中,纯格式quote_ident(_tbl)或format(%I)由于无法解决歧义性而可能会失败。您将必须分别传递和转义模式名称和表名称。

我仍然使用format(),因为它简化了语法(并演示了如何使用),但是使用%s代替%I。通常,查询更为复杂,因此format()可以提供更多帮助。对于简单的示例,我们还可以串联:

  EXECUTE 'SELECT (EXISTS (SELECT FROM ' || _tbl || ' WHERe id = 1))::int'

列表中id只有一个表时,无需对列进行表限定FROM。在此示例中,没有任何歧义。(动态)内部的SQL命令EXECUTE具有单独的作用域,函数变量或参数在那里不可见-与函数主体中的普通SQL命令相反。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407552.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号