postgresql菜鸟教程|PostgreSQL中search_path函数注意事项

时间:2020-10-28  来源:PostgreSQL  阅读:

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 ;

postgresql菜鸟教程|PostgreSQL中search_path函数注意事项

http://m.bbyears.com/shujuku/107374.html

推荐访问:postgresql和mysql区别
相关阅读 猜你喜欢
本类排行 本类最新