Незавершенная строка в долларовых кавычках, создающая функцию PostgreSQL

Используя PostgreSQL 12.3, у меня возникли проблемы с попыткой проверить этот простой фрагмент кода plpgsql.

create or replace function test() 
returns void 
as $$
begin
  prepare plan as select 1;
  execute plan;
end;
$$ language plpgsql;

Ошибка

Unterminated dollar-quoted string at or near "$$ begin prepare plan as select 1;"

Пробовал с ; и без end. Я также пробовал использовать sql вместо plpgsql. Есть идеи, что не так?

Это db-fiddle для быстрого тестирования кода:

https://www.db-fiddle.com/f/KgRZcxXqJs2Lwe284Mj5y/3


person coterobarros    schedule 07.07.2020    source источник
comment
Дай угадаю, HeidiSQL?   -  person Laurenz Albe    schedule 07.07.2020
comment
Я предполагаю, что любой клиент, который вы используете для запуска SQL, не поддерживает долларовые кавычки. Вам нужно будет заменить каждую пару $ одним '. Имейте в виду, что если в теле функции есть какие-либо одинарные кавычки, вам нужно их экранировать. В качестве бонуса рассмотрите возможность использования DBeaver для вашего клиента SQL.   -  person J Spratt    schedule 07.07.2020
comment
Хорошо, я вижу. Это просто неспособность клиента   -  person coterobarros    schedule 07.07.2020
comment
J Spratt, спасибо за знакомство с DBeaver, просто потрясающе!   -  person coterobarros    schedule 07.07.2020


Ответы (1)


Проблема не в цитировании $$:

create or replace function test() 
returns void 
as $$
begin
  prepare plan as select 1;
  execute plan;
end;
$$ language plpgsql;
CREATE FUNCTION

 select test();
ERROR:  column "plan" does not exist
LINE 1: SELECT plan
               ^
QUERY:  SELECT plan
CONTEXT:  PL/pgSQL function test() line 4 at EXECUTE

Когда вы запускаете это в dbfiddle, полный вывод ошибки:

 Schema Error: error: unterminated dollar-quoted string at or near "$$ begin prepare plan as select 1;"
Schema Error: error: prepared statement "plan" does not exist
Schema Error: error: unterminated dollar-quoted string at or near "$$ language plpgsql;"
Query Error: error: function test() does not exist 

Проблема в том, что EXECUTE внутри plpgsql — это отдельная команда:

https://www.postgresql.org/docs/12/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

EXECUTE command-string [ INTO [STRICT] target ] [ USING expression [, ... ] ];

Я бы использовал форму plpgsql. Это работает:

create or replace function test() 
returns void 
as $$
begin
  prepare plan as select 1;
  EXECUTE 'execute plan';
  RAISE NOTICE 'Made it';
  DEALLOCATE plan;
end;
$$ language plpgsql;

select test();
NOTICE:  Made it
 test 
------
 
(1 row)


person Adrian Klaver    schedule 07.07.2020
comment
Спасибо Адриан! - person coterobarros; 07.07.2020
comment
Можно ли вернуть несколько строк из EXECUTE внутри функционального теста? Я имею в виду, изменить returns void на returns table (...) - person coterobarros; 07.07.2020
comment
Документы — ваш друг. Начните здесь plpgsql. Здесь у вас есть зацикливание и там у вас есть Оператор FOR-IN-EXECUTE - это еще один способ перебора строк: ... - person Adrian Klaver; 07.07.2020