2016-12-21 9 views
0

Я пытаюсь построить функцию, которая возвращает некоторый текст. Текст включает в себя BEGIN заявление, в котором, кажется, вызывает ошибку:Как избежать синтаксической ошибки при возврате текста, который включает в себя инструкцию BEGIN?

CREATE OR REPLACE FUNCTION create_trigger() RETURNS TEXT AS $$ 
BEGIN 
    RETURN 
    'CREATE OR REPLACE FUNCTION update_view() RETURNS trigger AS $$ 
     BEGIN -- error is near this begin 
     IF TG_OP = ''INSERT'' THEN DO SOMETHING; 
     ELSIF TG_OP = ''UPDATE'' THEN DO SOMETHING; 
     END IF; 
     RETURN NEW; 
     END; 
    $$ language plpgsql'; 
END; 
$$ language plpgsql 

Я получаю синтаксическую ошибку рядом со словом BEGIN в обратном заявлении и не понимаю, почему, так как я только пытаюсь вернуть текст , Это потому, что plpgsql распознает слово BEGIN, даже если оно находится в строковой части кода?

+0

Не могли бы вы попробовать добавить ',' 'после END;' – McNets

+0

Не работает (отредактировано сообщение с этой модификацией) – kaycee

+1

Начало не вызывает ошибки, это вложенный '$$'. Используйте другой разделитель для цитируемой функции. – alzee

ответ

0

Как user3137702 commented проблема связана с долларовыми котировками. Я бы также предложить некоторые другие упрощения:

CREATE OR REPLACE FUNCTION create_trigger() 
    RETURNS text AS 
$func$ 
SELECT 
    $f$CREATE OR REPLACE FUNCTION update_view() 
     RETURNS trigger AS 
     $func1$ 
     BEGIN 
     CASE TG_OP 
     WHEN 'INSERT' THEN -- DO SOMETHING; 
     WHEN 'UPDATE' THEN -- DO SOMETHING; 
     END CASE; 
     RETURN NEW; 
     END; 
     $func1$ LANGUAGE plpgsql$f$; 
$func$ LANGUAGE sql IMMUTABLE; 

О цитировании и вложенными доллар кавычки: