在我的PostgreSQL-9.6数据库中,无论好坏,都有很多PLV8功能。我们的一些数据库业务逻辑只需要在JavaScript中完成。
但是,在这些PLV8函数中,vanilla SQL中有很多数据库查询。如果考虑小型单线,这绝对没问题。
但是,有时我的SQL语句可能包含400或500行代码。
我知道有两种方法可以做到这一点:
将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语法高亮,存储函数不会立即发现语法错误(你必须先执行以便检测它们),关于哪一行可能抛出错误的反馈可能是不准确的。它很难处理。
创建一个从PLV8函数中调用的SQL函数,如
plv8.execute('SELECT my_inner_function(id,$ 2)FROM my_table WHERE some_column = $ 1',[paramOne,paramTwo]);
但是,据我测试:为主表的每个元素调用一个函数比在该表上执行实际查询要慢。
那么,是否有另一种更好的方法可以在PLV8函数中插入“本机”SQL?