2013-03-11 3 views
-4

У меня есть функция Postgres, которая проходит следующий циклвыполнить команду в то время как петли

while x<=colnum LOOP EXECUTE
'Update attendrpt set slot'||x||' = pres from (SELECT branch, semester, attend_date , div, array_to_string(ARRAY_AGG(first_name||':'||alias_name||':'||lect_type||':'|| to_char(present,'99')),';') As pres from attend1 where lecture_slot_no ='||x||' group by branch, semester, attend_date , div) j where attendrpt.branch=j.branch and attendrpt.semester=j.semester and attendrpt.attenddate=j.attend_date and attendrpt.div=j.div;';

 `x:=x+1; 
    END LOOP;` 

Проблема здесь в том, что конфликтует одинарные кавычки закрытия в запросе и команду выполнить. Так или иначе, чтобы решить это. Спасибо заранее.

+2

Да, пожалуйста * всегда * отправляйте полную функцию. Ваш вопрос бессмыслен, не показывая все это. И в читаемом формате. –

+0

@SJCET ваше редактирование удалило форматирование Erwin для вашего кода и заменило его тем же (?) Нечитаемым беспорядком. Предварительный просмотр. Используйте кнопку '{}' отступать от кода. Пожалуйста, покажите * целую функцию * из 'CREATE [OR REPLACE] FUNCTION' до конца точки с запятой. –

ответ

2

Введите описание функции с помощью долларового котирования (например, $BODY$ или просто $$) согласно руководству.

Использовать execute ... using вместо замены строки. Для подстановки идентификаторов используется спецификатор формата %I из функции format.

Если вы абсолютно необходимо использовать || конкатенации, скажем, если вы на какой-то древней версии PostgreSQL, вам нужно использовать quote_literal и quote_ident функции, чтобы избежать проблем с экранированием и потенциальные проблемы безопасности.

Помимо этого, похоже, что весь подход совершенно не нужен; вы делаете то, что выглядит так, как это можно сделать в простом SQL.

+0

Спасибо, но я решил проблему, используя одинарные кавычки дважды для внутренних кавычек. – SJCET

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