PostgreSQL выполнить + дата - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь создать оператор выбора SQL в процедуре PL / pgSQL. Все было хорошо, пока мне не пришлось добавить date к выбору. Проблема в том, что для сравнения дат в предложении select моя дата должна быть заключена в одинарные кавычки '' (например, '01. 01.2011'), но в моем случае это уже тип text, и я не могу добавить его туда .

Ниже приведен пример кода, который должен иметь ту же проблему:

CREATE OR REPLACE FUNCTION sample(i_date timestamp without time zone)
  RETURNS integer AS
$BODY$
DECLARE
  _count integer := 0;
  _sql text := '';
BEGIN

  IF i_date IS NOT NULL THEN
   _cond := _cond || ' AND t.created>' || i_date;
END IF;

_sql := 'SELECT count(*) FROM test t WHERE 1=1' || _cond;

EXECUTE _sql INTO _count;
RETURN _count;

END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

Есть ли другой способ "сбежать" от даты? Или какие-то другие предложения?

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Чтобы безопасно и эффективно использовать значения в динамически создаваемой и исполняемой строке SQL, существует ряд возможностей. Лучше всего использовать предложение USING , например:

CREATE OR REPLACE FUNCTION sample(_date timestamp without time zone)
RETURNS integer AS
$BODY$
BEGIN
    RETURN QUERY EXECUTE '
    SELECT count(*)::int
    FROM   test t
    WHERE  t.created > $1'
    USING  _date;
END;
$BODY$ LANGUAGE plpgsql VOLATILE;

Это на самом деле плохой пример, потому что его можно упростить до:

CREATE OR REPLACE FUNCTION sample(_date timestamp)
RETURNS integer AS
$BODY$
    SELECT count(*)::int
    FROM   test
    WHERE  created > $1;
$BODY$ LANGUAGE sql;

Другой способ - использовать quote_literal().
Я написал больше о динамическом SQL в plpgsql здесь.

0 голосов
/ 09 июля 2013

Я пытаюсь выполнить ту же команду, как этот

declare
    _count integer := 0;
    _sql text := '';
begin
    _sql := 'SELECT count(*) FROM test t WHERE 1=1';
    EXECUTE _sql INTO _count;
    RETURN _count;
end;

и выдает ошибку в _integer сразу после объявления оператора ... не знаю, как решить проблему ... Я даже попробовал несколько примеров из оригинального сайта postgre и пример документации, но они даже не работают SQL-сервер позволяет запускать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...