Огромный SQL-запрос внутри функции PLV8

В моей базе данных PostgreSQL-9.6, что бы там ни было, есть много функций 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;
    

Недостатком является то, что вы теряете подсветку синтаксиса SQL в pgAdmin, сохранение функции не приведет к немедленному обнаружению синтаксических ошибок (для их обнаружения необходимо выполнить сначала), обратная связь о том, какая строка может вызвать ошибки, может быть неточной. И с этим трудно справиться.

  1. Создайте функцию SQL, которая вызывается из функций PLV8, таких как

    plv8.execute('ВЫБЕРИТЕ my_inner_function(id,$2) ОТ my_table WHERE some_column = $1',[paramOne,paramTwo]);

Однако, насколько я тестировал: вызов функции для каждого элемента главной таблицы медленнее, чем выполнение фактического запроса к этой таблице.

Итак, есть ли другой, лучший способ для вставки "родного" SQL внутри функции PLV8?

0 ответов

Другие вопросы по тегам