0

Soo, here is the thing, I am using in my DB methods 2 approaches:

1.) Is compose and SQL query from various string, depending on what I need to filter out:

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.) Copy part of the big table, into smaller temp table and work with it:

    -- 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);

But what If I want to mix those two?

I want to have the SELECT after CREATE TEMP TABLE temp_fpl_filtered AS to have different WHERE clauses depending on input parameters of stored procedure, without having to write the same statement xy times in one stored procedure.

But my approach:

-- 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;

throws me an exception when I try to inser stored procedure:

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;
                                                      ^

Also, the another try:

EXECUTE short_cmd INTO TEMP TABLE temp_short_full;

is not working..

0

1 Answer 1

2

You need to include the CREATE TABLE part into the SQL you generate:

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;
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.