首页 > 解决方案 > 如何使扩展可重定位?

问题描述

我不知道如何使扩展名可重定位。问题:如何使扩展移动到另一个方案。下面,开始描述。之后是运算符、函数、方差、数学期望的创建。

create schema IF NOT EXISTS complex;

--Mathematical expectation
--creating a complex data type
create type complex.complex as (re float, im float);
--creation of complex data type with the sum of complex numbers and the amount of numbers--
create type complex.complexSumAndCount as (complexSumVar complex.complex, complexCount integer);

--Creating the function of adding complex numbers
CREATE or REPLACE function complex.complexSumFunction (sum complex.complex, complexTempVar complex.complex)
    RETURNS complex.complex as
$$
BEGIN

    IF sum is not null and complexTempVar is not null then
        sum.re := coalesce(sum.re, 0) + coalesce(complexTempVar.re, 0);
        sum.im := coalesce(sum.im, 0) + coalesce(complexTempVar.im, 0);
    end IF;

    RETURN sum;

end; $$LANGUAGE plpgSQL;

标签: postgresql

解决方案


好的,发布指向 github 存储库的链接可能不是改进问题的推荐方法。您还没有告诉我您是否真的在尝试编写扩展程序。

我猜你不是,因为你似乎没有 .control 文件。

如果你想要做的是能够写

select '(6,44)'::complex;

而不是

select '(6,44)'::complex.complex;

那么您需要了解的是search_path

当您没有明确指定模式时,这控制了将在哪些模式中搜索对象(类型、表、函数等)。

所以 - 你有两个选择。当你想运行查询时,你可以将你的“复杂”模式添加到你的 search_path 中。或者你可以将你的“复杂”类型和函数放在你当前的 search_path 中。

您可以使用以下方法临时设置您的 search_path(针对当前事务或会话):

SET search_path = public, complex;

您可以使用以下内容更改用户或数据库的默认值:

ALTER USER myuser SET search_path = public, complex;
ALTER USER mydatabase SET search_path = public complex;

第二个选项是将您的“复杂”代码加载到您的 search_path 中已经存在的模式中。为此,您将从script1.sql文件中删除对模式的所有引用。

create type complex as (re float, im float);
create type complexSumAndCount as (complexSumVar complex.complex, complexCount integer);
...

然后,当您加载它时,您的类型和函数将在您的 search_path 中可以找到的第一个模式中创建。最好将其设置为您想要的。

SET search_path = public;
\i script1.sql

或从命令行

PGOPTIONS="--search_path=public" psql -U myuser -d mydb -f script1.sql

我希望这会有所帮助。如果这不是您所追求的,那么恐怕您将需要发布一个新问题并准确解释您要做什么。如果您想就您的问题进行更长时间的对话,那么 postgresql 邮件列表可能是一个不错的尝试。


推荐阅读