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

时间:2018-04-03 13:52:12

标签: postgresql plv8

我想将google的开放位置代码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 个答案:

答案 0 :(得分:1)

您有两种选择。

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

  2. 将该功能放在初始化模块中,并使用配置参数plv8.start_proc设置该模块,以便在启动时自动执行。您可以在the PL/v8 documentation.

  3. 中找到详细信息

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