2013-09-10 4 views
0

Я хочу выполнить запрос с ltree парами в plpgsql функции ... но я немогу понять, как использовать кавычки в этой функции ...Использования ltree запроса в plpgsql функции как пары в PostgreSQL

CREATE OR REPLACE FUNCTION f_select(BIGINT) RETURNS setof categories AS 
$$ 
DECLARE 
    s_cat ALIAS FOR $1; 

    queryText TEXT; 
    result categories%ROWTYPE; 

BEGIN 
    queryText := 'SELECT * FROM categories WHERE cat_tree ~ \'*.\'|| s_cat::text ||\'.*\''; 

    FOR result IN EXECUTE queryText 
    LOOP 
     RETURN NEXT result; 
    END LOOP; 

    RETURN; 

END 
$$ 
LANGUAGE plpgsql; 

Как это сделать ???

После выполнения этого кода в PSQL я получаю сообщение об ошибке:

ERROR: syntax error at or near "." 
LINE 10: ... := 'SELECT * FROM categories WHERE cat_tree ~ \'*.\'|| s_ca... 

Заключительный рабочий verison:

CREATE OR REPLACE FUNCTION f_select(BIGINT) RETURNS setof categories AS 
$$ 
DECLARE 
    s_cat ALIAS FOR $1; 

    queryText TEXT; 
    result categories%ROWTYPE; 

BEGIN 

    queryText := 'SELECT * FROM categories WHERE cat_tree ~ ''' || ('*.'|| s_cat::text || '.*')::lquery || ''''; 

    FOR result IN EXECUTE queryText 
    LOOP 
     RETURN NEXT result; 
    END LOOP; 

    RETURN; 

END 
$$ 
LANGUAGE plpgsql; 
+0

Спасибо, но Don 'T помочь мне, я попробовать его, прежде чем комментировать buuut ... – dezconnect

+0

Хорошо, вы можете представить структуру таблицы и некоторые примеры данных, например, как SQL скрипку (HTTP: // sqlfiddle.com/)? – zero323

+0

Способ цитирования одной цитаты - добавить еще одну цитату. Не беспокойтесь о обратной косой чертой, они устарели. –

ответ

1

Проблема, кажется, злоупотребляет обратной косой черты, но в любом случае поставить этот запрос в текстовой переменной в первую очередь, не требуется.

Что об этой форме:

FOR result IN SELECT * FROM categories WHERE cat_tree ~ '*.'|| s_cat::text || '.*' 
LOOP 
    RETURN NEXT result; 
END LOOP; 

И если LOOP просто должен возвращать результаты, вы можете точно так же избежать его и возвращает запрос непосредственно:

RETURN QUERY SELECT * FROM categories WHERE cat_tree ~ '*.'|| s_cat::text || '.*'; 

EDIT: Поскольку оператор ltree ~ lquery и ~ связывает более плотное, чем ||, правый операнд должен быть заключен в круглые скобки и лить в lquery :

RETURN QUERY SELECT * FROM categories 
    WHERE cat_tree ~ ('*.'|| s_cat::text || '.*')::lquery; 
+0

Спасибо за ответ ... но ваша версия не работает по той же причине. Потребность в цитировании одинарных кавычек. imho – dezconnect

+0

@dezconnect: нет, это другая причина. Я редактировал запрос в редакторе. –

+0

Спасибо! это работает! – dezconnect

Смежные вопросы