PostgreSQL 与大多数数据库一样,通过schema,逻辑上划分对象的归属,如图。
因为有了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 ;
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔