postgresql - 是否可以使用 PostgreSQL plv8 扩展创建可重用的函数?

标签 postgresql plv8

我想将谷歌的开放位置代码 javascript 实现放入 PostgreSQL(使用 plv8 extension )并使其可用于从 PostGIS 几何/地理数据类型进行编码/解码。

虽然我成功了,但我无法弄清楚如何只为 https://github.com/google/open-location-code/blob/master/js/src/openlocationcode.js 创建一个函数文件,我最终将该函数的副本放入我需要编码/解码加代码的每个函数中。当我试图将它拉出到它自己的函数中时,我要么得到一个包含 javascript 的字符串,要么得到一个 [Object]、[object] 的字符串,而不是一个可调用函数。

PostgreSQL 中的 plv8 扩展是否可行?

不完整的代码片段示例(full version here):

DROP FUNCTION IF EXISTS olc.encode(float,float,integer);

CREATE OR REPLACE FUNCTION olc.encode(
    p_latitude double precision,
    p_longitude double precision,
    p_code_length integer DEFAULT 10
)
  RETURNS text AS
$BODY$


 var f  =  function () {
    var OpenLocationCode = {};

    /**
     * Provides a normal precision code, approximately 14x14 meters.
     * @const {number}
     */
    OpenLocationCode.CODE_PRECISION_NORMAL = 10;

    /**
     * Provides an extra precision code, approximately 2x3 meters.
     * @const {number}
     */
    OpenLocationCode.CODE_PRECISION_EXTRA = 11;

    // A separator used to break the code into two parts to aid memorability.
    var SEPARATOR_ = '+';

    // The number of characters to place before the separator.
    var SEPARATOR_POSITION_ = 8;

    // The character used to pad codes.
    var PADDING_CHARACTER_ = '0';

最佳答案

您有两个选择。

  1. 将函数的源代码存储在一个特殊的数据库表中,并使用selecteval() 加载它。阅读此答案中的详细信息:Can plv8 JavaScript language extension call 3rd party libraries?

  2. 将函数放在初始化模块中,并使用配置参数 plv8.start_proc 设置此模块,以便在启动时自动执行。您可以在 the PL/v8 documentation. 中找到详细信息

第二个选项非常方便,不需要额外的表格,但可能看起来有点棘手。一个简单的例子:我们想要在我们所有的 plv8 函数中预定义一个函数 square_of_sum(a, b)。首先,创建初始化函数:

create or replace function plv8_init()
returns void language plv8 as $$

    square_of_sum = function(a, b) {
        return (a+ b)* (a+ b)
    }

$$;

设置数据库的初始化函数:

alter database my_database set plv8.start_proc to plv8_init;

并关闭当前连接。

在所有后续 session 中,函数 square_of_sum(a, b) 在所有其他 plv8 函数中都是已知的,例如:

create or replace function js_test()
returns int language plv8 as $$
    return square_of_sum(3, 2)
$$;

select js_test();

 js_test
---------
      25
(1 row) 

关于postgresql - 是否可以使用 PostgreSQL plv8 扩展创建可重用的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49631866/

相关文章:

postgresql - 使用带有 PostgreSQL 和 JSONb 输入的 mustache 模板

postgresql - 如何在 CentOS 6.7 的 postgresql 9.5 中安装 plv8?

windows - Windows 上的 pg_upgrade 无法写入日志文件 pg_upgrade_internal.log

postgresql - 对于与 parent 的帖子,我应该使用哪种嵌套数据结构?

sql - 为什么在 PostgreSQL 中执行 COPY 时序列没有更新?

postgresql - 可以从 plv8 函数中调用另一个模式中的函数吗?

database - 如何在 Postgres 中找到用户自定义类型的属性信息?

json - 在 PostgreSQL 中聚合 JSON

postgresql - 在postgresql中实现自定义比较