PostgreSQL plv8扩展能否创建可重复使用的函数?

4
我想将 Google 的开放位置代码 JavaScript 实现(使用 plv8 扩展)嵌入到 PostgreSQL 中,并使其可用于对 PostGIS 几何/地理数据类型进行编码/解码。
虽然我成功了,但我无法弄清楚如何仅为 https://github.com/google/open-location-code/blob/master/js/src/openlocationcode.js 文件创建单个函数,因此我最终在每个需要编码/解码 plus codes 的函数中都复制了该函数。当我试图将其提取到自己的函数中时,我只能得到包含 JavaScript 字符串或 [Object],[object] 字符串而不是可调用函数。
在 PostgreSQL 中,使用 plv8 扩展是否可能实现这一点?
不完整的代码片段示例(完整版本在此处):
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个回答

6

您有两个选项。

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

  2. 将函数放置在初始化模块中,并使用配置参数 plv8.start_proc 设置此模块,以便在启动时自动执行。有关详细信息,请参见PL/v8文档。

第二个选项非常方便,不需要额外的表格,但可能看起来有些棘手。举个简单的例子:我们希望在所有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;

关闭当前连接。

在所有后续的会话中,函数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) 

我已经给那个问题点赞了,然后忘记回来看了。但是那个(select+eval)完美地解决了问题。谢谢! - Jay Cummins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接