【问题标题】:Is it possible to create a re-usable function with the PostgreSQL plv8 extension?是否可以使用 PostgreSQL plv8 扩展创建可重用函数?
【发布时间】:2018-09-12 21:15:24
【问题描述】:

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

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

PostgreSQL 中的 plv8 扩展可以做到这一点吗?

不完整的代码sn-p示例(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';

【问题讨论】:

    标签: postgresql plv8


    【解决方案1】:

    你有两个选择。

    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;
    

    并关闭当前连接。

    在所有后续会话中,函数 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) 效果很好。谢谢!
    猜你喜欢
    • 2017-09-26
    • 2015-06-11
    • 2015-04-11
    • 1970-01-01
    • 2019-12-07
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多