От коментарите най-накрая мисля, че разбирам. Имате нужда от динамичен SQL :
CREATE OR REPLACE FUNCTION foo(lastcontact timestamptz)
RETURNS void AS
$func$
DECLARE
myrec record;
mycond boolean;
BEGIN
FOR myrec IN
SELECT * FROM tabel ORDER BY colorlevel, volgnummer
LOOP
IF myrec.conditie ~~ '%lastcontact %' THEN -- special case for input param
myrec.conditie := replace (myrec.conditie
, 'lastcontact '
, CASE WHEN lastcontact IS NULL THEN 'NULL '
ELSE '''' || lastcontact::text || ''' ' END);
END IF;
EXECUTE 'SELECT ' || myrec.conditie || ' FROM tabel' INTO mycond;
IF mycond then
RAISE NOTICE 'Condition % is true', myrec.conditie;
ELSE
RAISE NOTICE 'Condition % is false', COALESCE(myrec.conditie, 'NULL');
END IF;
END LOOP;
END
$func$ LANGUAGE plpgsql;
Имайте предвид обаче, че тази настройка е широко отворена за SQL инжектиране . Използвайте само потвърден вход. Функция работи в PostgreSQL 8.3 също (без DO
изявления, все още).
Не можете да препращате към параметри в динамичния SQL (EXECUTE
изявление). Трябва да поставите стойността в низа на заявката.
В PostgreSQL 8.4 или по-нова версия имате превъзходната стока на USING
клауза
. Уви, не във версия 8.3. Трябва да помислите за надграждане, ако можете.
Въведох заобиколно решение за старата ви версия. Трябва да обърнете специално внимание на NULL
стойност.