Огромный SQL-запрос внутри функции PLV8
В моей базе данных PostgreSQL-9.6, что бы там ни было, есть много функций 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;
Недостатком является то, что вы теряете подсветку синтаксиса SQL в pgAdmin, сохранение функции не приведет к немедленному обнаружению синтаксических ошибок (для их обнаружения необходимо выполнить сначала), обратная связь о том, какая строка может вызвать ошибки, может быть неточной. И с этим трудно справиться.
Создайте функцию SQL, которая вызывается из функций PLV8, таких как
plv8.execute('ВЫБЕРИТЕ my_inner_function(id,$2) ОТ my_table WHERE some_column = $1',[paramOne,paramTwo]);
Однако, насколько я тестировал: вызов функции для каждого элемента главной таблицы медленнее, чем выполнение фактического запроса к этой таблице.
Итак, есть ли другой, лучший способ для вставки "родного" SQL внутри функции PLV8?