search_path在PostgreSQL函数开发中的注意事项

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Tair(兼容Redis),内存型 2GB
简介: 背景 PostgreSQL 与大多数数据库一样,通过schema,逻辑上划分对象的归属,如图。 用户还可以参考《PostgreSQL 逻辑结构 和 权限体系 介绍》https://yq.aliyun.com/articles/41210 因为有了schema的概念,在访问数据库中的对象

背景

PostgreSQL 与大多数数据库一样,通过schema,逻辑上划分对象的归属,如图。
1

用户还可以参考《PostgreSQL 逻辑结构 和 权限体系 介绍》
https://yq.aliyun.com/articles/41210

因为有了schema的概念,在访问数据库中的对象时,我们需要指定是哪个schema下面的。

例如schema_a.table。

为了方便用户使用,PostgreSQL 还有一个客户端的环境参数叫search_path,用来控制搜索路径的顺序。

例如 search_path= '"$user",public' 表示优先搜索与当前用户名同名的schema,如果没有则搜索public schema。

例如 当前用户为a, 在数据库中有一张表是a.tbl还有一张表public.tbl。 那么select * from tbl,访问的是a.tbl。

函数编写注意事项

我们在写函数时,很容易忽略一点,就是搜索路径。

比如我写了一个这样的函数

sanity=> CREATE OR REPLACE FUNCTION "digoal"."getbusinessname"("ptypeno" varchar)
  RETURNS "pg_catalog"."varchar" AS $BODY$

        BEGIN

                RETURN (select typename from tbl_core_bus where typeno= ptypeno);

        END;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
CREATE FUNCTION

会有点乱哦,tbl_core_bus表到底是哪个schema下的呢?
与search_path有关,所以如果在search_path中没有这个表时,访问这个函数就会报错。

因此在写函数时务必注意,使用schema,避免这种问题。

上面的函数可以改成如下,在访问对象的前面加上schema表示

CREATE OR REPLACE FUNCTION "digoal"."getbusinessname"("ptypeno" varchar)
  RETURNS "pg_catalog"."varchar" AS $BODY$

        BEGIN

                RETURN (select typename from digoal.tbl_core_bus where typeno= ptypeno);

        END;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

或者改成如下,设置函数的参数search_path

CREATE OR REPLACE FUNCTION "digoal"."getbusinessname"("ptypeno" varchar)
  RETURNS "pg_catalog"."varchar" AS $BODY$

        BEGIN

                RETURN (select typename from tbl_core_bus where typeno= ptypeno);

        END;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE set search_path='digoal';

或者改成如下,在函数内使用set命令设置search_path

CREATE OR REPLACE FUNCTION "digoal"."getbusinessname"("ptypeno" varchar)
  RETURNS "pg_catalog"."varchar" AS $BODY$

        BEGIN
        set search_path='digoal';

                RETURN (select typename from tbl_core_bus where typeno= ptypeno);

        END;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE ;

祝大家玩得开心,欢迎随时来 阿里云促膝长谈业务需求 ,恭候光临。

阿里云的小伙伴们加油,努力 做好内核与服务,打造最贴地气的云数据库

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
2月前
|
关系型数据库 Serverless 定位技术
PostgreSQL GIS函数判断两条线有交点的函数是什么?
PostgreSQL GIS函数判断两条线有交点的函数是什么?
244 60
|
3月前
|
SQL 自然语言处理 关系型数据库
在 PostgreSQL 中使用 `REPLACE` 函数
【8月更文挑战第8天】
863 9
在 PostgreSQL 中使用 `REPLACE` 函数
|
2月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
3月前
|
关系型数据库 PostgreSQL
PostgreSQL的null值函数
【8月更文挑战第20天】PostgreSQL的null值函数
91 3
|
3月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
364 0
|
4月前
|
SQL Oracle 关系型数据库
|
4月前
|
关系型数据库 BI 数据处理
|
5月前
|
JSON 关系型数据库 数据库
PostgreSQL中json_to_record函数的神秘面纱
`json_to_record`是PostgreSQL中的函数,用于将JSON数据转换为RECORD类型,便于查询和分析。基本用法是传入JSON数据,如`SELECT json_to_record('{"name": "张三", "age": 30}'::json);`。还可结合FUNCTION创建自定义函数,实现复杂功能。在实际应用中,它简化了对JSON格式数据的处理,例如筛选年龄大于30的用户。了解并善用此函数能提升数据库操作效率。本文由木头左分享,期待你的点赞和收藏,下次见!
PostgreSQL中json_to_record函数的神秘面纱
|
5月前
|
SQL 关系型数据库 数据库
PostgreSQL 常用函数分享
PostgreSQL 常用函数分享
44 0
|
6月前
|
Cloud Native 关系型数据库 OLAP
从0~1,基于DMS面向AnalyticDB PostgreSQL的数据ETL链路开发
在传统数仓中,往往采用资源预购的方式,缺少面向业务的资源调整灵活性。 在数据分析这种存在明显业务波峰波谷或分时请求的场景下,实例无法按需使用,造成了大量成本浪费。云原生数仓AnalyticDB PostgreSQL产品自2022年2月正式发布了Serverless版之后,依托于内核强大的资源管理能力...