Postgresql: ВЫПОЛНИТЬ sql_cmd объединить с CREATE TEMP TABLE temp_tbl AS SELECT - PullRequest
0 голосов
/ 10 сентября 2018

Так вот, вот что я использую в своих методах БД: 2 подхода:

1.) Составляет и SQL-запрос из различных строк, в зависимости от того, что мне нужно отфильтровать:

sql_cmd := 'SELECT count(*) FROM art_short_term_finished WHERE (entry_time <= ''' || timestamp_up || ''' AND exit_time >= ''' || timestamp_down || ''') AND ' ||  time_filter || ' AND entry_zone = ' || zone_parameter || ' AND park_uuid = ' || park_id_p || '';
EXECUTE sql_cmd INTO shortterm_counter;

2.) Скопируйте часть большой таблицы в меньшую временную таблицу и работайте с ней:

    -- Get the data from FPL into smaller table for processing
    DROP TABLE IF EXISTS temp_fpl_filtered;
    CREATE TEMP TABLE temp_fpl_filtered AS SELECT car_id FROM flexcore_passing_log fpl WHERE fpl.zone_leaved = '0' AND fpl.status IN (SELECT status_id FROM fpl_ok_statuses) AND fpl.park_uuid = park_id_p AND (fpl.datetime BETWEEN row_i.start_d AND row_i.end_d);

Но что, если я захочу смешать эти два?

Я хочу, чтобы SELECT после CREATE TEMP TABLE temp_fpl_filtered AS имел различные предложения WHERE в зависимости от входных параметров хранимой процедуры, без необходимости писать один и тот же оператор xy раз в одной хранимой процедуре.

Но мой подход:

-- art class is shortterm, check shortterm history
IF art_class_p = 1 OR article_p = 0 THEN
  -- create temporary table derivated from shortterm history
  IF article_p = 0 THEN
    article_p_filter := '';
  ELSE
    article_p_filter := ' AND article_id = ' || article_p;
  END IF;

  short_cmd := 'SELECT car_id, article_id, entry_time, exit_time FROM art_short_term_finished WHERE zone_leaved = ''0'' AND status IN (SELECT status_id FROM fpl_ok_statuses) ''' || article_p_filter || ''' AND park_uuid = ''' || park_id_p || ''' AND (entry_time <= ''' || timestamp_up || ''' AND exit_time >= ''' || timestamp_down || ''')'; 

  DROP TABLE IF EXISTS temp_short_full;
  CREATE TEMP TABLE temp_short_full AS short_cmd;
  --EXECUTE sql_cmd INTO shortterm_counter;
END IF;

выдает мне исключение при попытке вставить хранимую процедуру:

psql:report_parking_average.sql:107: ERROR:  syntax error at or near "short_cmd"
LINE 50:       CREATE TEMP TABLE temp_fpl_filtered AS short_cmd;
                                                      ^

Кроме того, другая попытка:

EXECUTE short_cmd INTO TEMP TABLE temp_short_full;

не работает ..

1 Ответ

0 голосов
/ 10 сентября 2018

Вам необходимо включить часть CREATE TABLE в генерируемый вами SQL:

short_cmd := 'CREATE TEMP TABLE temp_short_full AS SELECT car_id, article_id, entry_time, exit_time FROM art_short_term_finished WHERE zone_leaved = ''0'' AND status IN (SELECT status_id FROM fpl_ok_statuses) ''' || article_p_filter || ''' AND park_uuid = ''' || park_id_p || ''' AND (entry_time <= ''' || timestamp_up || ''' AND exit_time >= ''' || timestamp_down || ''')'; 

DROP TABLE IF EXISTS temp_short_full;
execute short_cmd;
...