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

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: 背景 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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
3月前
|
Cloud Native 关系型数据库 分布式数据库
|
5月前
|
关系型数据库 数据库 C语言
PostgreSQL服务端开发学习 -- Datum
在使用C语言开发PostgreSQL后端、客户端应用时,Datum无处不在,所以必须要对Datum有很清楚的了解。
133 2
|
6月前
|
关系型数据库 开发工具 C语言
PostgreSQL libpq开发入门
简单入门C语言开发基于PostgreSQL libpq应用
104 0
|
5月前
|
关系型数据库 C语言 PostgreSQL
PostgreSQL服务端开发学习 --- 常用结构及宏定义1
本篇主要讲解使用C语言开发PostgreSQL服务端应用(libpq、自定义函数、扩展)常用到的结构及宏定义。
96 0
|
移动开发 关系型数据库 PostgreSQL
PostgreSQL 条件判断函数
PostgreSQL 条件判断函数
752 1
|
2月前
|
SQL 存储 缓存
PostgreSQL函数管理接口
学习PostgreSQL服务端开发必须要对函数管理接口有比较深入的了解
143 0
|
5月前
|
关系型数据库 C语言 PostgreSQL
PostgreSQL服务端开发学习 -- fmgr.h
fmgr按官方的解释就是Postgres函数管理器和函数调用接口,在使用C语言开发PostgreSQL后端应用时,所以与backend交互时必须遵循fmgr.h中定义的一些规范。
140 0
|
1月前
|
关系型数据库 PostgreSQL
postgresql日程排程函数的编写实例
postgresql日程排程函数的编写实例
|
2月前
|
SQL 关系型数据库 分布式数据库
在PolarDB for PostgreSQL中,你可以使用LIKE运算符来实现类似的查询功能,而不是使用IF函数
在PolarDB for PostgreSQL中,你可以使用LIKE运算符来实现类似的查询功能,而不是使用IF函数
43 7
|
3月前
|
关系型数据库 分布式数据库 数据库
阿里云PolarDB开发者大会首度召开,让数据库开发像“搭积木”一样简单
阿里云PolarDB开发者大会首度召开,让数据库开发像“搭积木”一样简单
109 0