在我的 PostgreSQL-9.6-database 中,无论好坏,都有很多 PLV8 函数。我们的一些数据库业务逻辑只需在 JavaScript 中完成。
然而,在这些 PLV8 函数中,有很多普通 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?