3

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

然而,在这些 PLV8 函数中,有很多普通 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;
    

缺点是:你在 pgAdmin 中丢失了 SQL 语法高亮,存储函数不会立即发现语法错误(你必须先执行才能检测到它们),关于哪一行可能抛出错误的反馈可能不准确。而且很难处理。

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

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

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

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

4

0 回答 0