Хранимые процедуры Redshift не проходят должным образом - PullRequest
0 голосов
/ 08 ноября 2019

Я заметил, что Redshift меняет мою дату на '2001'. Запустите ниже для очень ясного простого примера

Result3 правильно сегодняшняя дата (которая является 2019-11-07). Однако Result2 (хранимая процедура) просто возвращает '2001'. Я пробовал кастовать, а также передавать дату по-другому, но результат остался прежним. Любые рекомендации?


CREATE OR REPLACE PROCEDURE pub.test_sp1(IN param date,INOUT tmp_name varchar(256))
AS $$
DECLARE 
  row record;
BEGIN
EXECUTE 'drop table if exists ' || tmp_name;
EXECUTE 'create temp table ' || tmp_name || ' as
select ' || param;
END;
$$ LANGUAGE plpgsql;

CALL pub.test_sp1(current_date, 'myresult');
SELECT * from myresult;

select current_date

1 Ответ

0 голосов
/ 08 ноября 2019
EXECUTE 'create temp table ' || tmp_name || ' as select ' || param;

преобразуется (после объединения строк и подстановки значений) в

EXECUTE 'create temp table myresult as select 2019-11-07'; -- => select 2001

Не объединяйте значения таким образом, используйте quote_ident() и quote_literal() для правильного цитирования:

EXECUTE 'create temp table ' || quote_ident(tmp_name) || ' as select ' || quote_literal(param);

или с функцией format():

EXECUTE format('create %I as select %L', tmp_date, param);

Например:

#= SELECT 'test: ' || current_date as incorrect, 
          'test: ' || quote_literal(current_date) as correct;
┌──────────────────┬────────────────────┐
│    incorrect     │      correct       │
├──────────────────┼────────────────────┤
│ test: 2019-11-07 │ test: '2019-11-07' │
└──────────────────┴────────────────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...