PLV8函数内部的巨大SQL查询

时间:2017-11-16 11:15:43

标签: sql postgresql postgresql-9.6 plv8

在我的PostgreSQL-9.6数据库中,无论好坏,都有很多PLV8功能。我们的一些数据库业务逻辑只需要在JavaScript中完成。

但是,在这些PLV8函数中,vanilla SQL中有很多数据库查询。如果考虑小型单线,这绝对没问题。

但是,有时我的SQL语句可能包含400或500行代码。

我知道有两种方法可以做到这一点:

  1. 将JavaScript中的查询字符串拆分为新行:

    CREATE OR REPLACE FUNCTION public.my_plv8_function
    ("paramOne" integer,"paramTwo" integer)
    
    RETURNS jsonb AS
    
    $BODY$    
    
    /* ... Do some magic, which can     
    /* ... only be done in PLV8 and not pure SQL ... */
    
    var queryString = 'WITH "myCTE" AS (  ' +
    
    'SELECT  ' +    
    'table1.colum1,  ' +    
    'table1.colum1,  ' +    
    /* ... 400 Lines of SQL code    
    with CTEs, subqueries, CASE WHEN, 
    COALESCE and so on and so on ...  */
    var myInnerSQL = plv8.execute(queryString,[paramOne,paramTwo]);
    
    return myInnerSQL;
    
    $BODY$
    
    LANGUAGE plv8 IMMUTABLE;
    
  2. 缺点是:你在pgAdmin中丢失了SQL语法高亮,存储函数不会立即发现语法错误(你必须先执行以便检测它们),关于哪一行可能抛出错误的反馈可能是不准确的。它很难处理。

    1. 创建一个从PLV8函数中调用的SQL函数,如

      plv8.execute('SELECT my_inner_function(id,$ 2)FROM my_table WHERE some_column = $ 1',[paramOne,paramTwo]);

    2. 但是,据我测试:为主表的每个元素调用一个函数比在该表上执行实际查询要慢。

      那么,是否有另一种更好的方法可以在PLV8函数中插入“本机”SQL?

0 个答案:

没有答案