Как преобразовать regclass в строку без кавычек? - PullRequest
0 голосов
/ 04 мая 2019

У меня есть хранимая процедура:

create or replace function make_bi_temporal( _tbl regclass )
returns void as $$
BEGIN
execute format( 'alter table %s drop constraint if exists %s_pkey', _tbl, _tbl );
...

Но я получаю ошибку при запуске select make_bi_temporal( 'check' )

ERROR:  syntax error at or near "_pkey"
LINE 1: alter table "check" drop constraint if exists "check"_pkey

Я пытался изменить %s на %I:

ERROR:  syntax error at or near "_pkey"
LINE 1: ...ter table "check" drop constraint if exists """check"""_pkey

до %L:

ERROR:  syntax error at or near "'"check"'"
LINE 1: alter table "check" drop constraint if exists '"check"'_pkey

Я хочу получить check_pkey.

Как форматировать без кавычек?

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Вашей первой ошибкой было создание таблицы с именем check, которое является зарезервированным ключевым словом .

create table check( id int primary key);
ERROR:  syntax error at or near "check"
LINE 1: create table check( id int primary key);

Вы или кто-то другой, должно быть, обошли это, цитируя это.

create table "check"( id int primary key);

Таким образом, это создаст ограничение первичного ключа с именем "check_pkey".

Ваш метод извлечения кавычек из regclass звучит не как правильное решение, а скорее как обходной путь.

Поскольку вам необходимо текстовое представление regclass, вы просто запрашиваете pg_class.

create or replace function make_bi_temporal( _tbl regclass )
returns void as $$
declare
 l_relname pg_class.relname%type;
BEGIN
   select relname||'_pkey' into l_relname from pg_class where oid = $1;
   execute format( 'alter table %s drop constraint if exists %s',$1,l_relname);
END $$ language plpgsql;   

DEMO

0 голосов
/ 04 мая 2019

Кажется, найдено решение через регулярное выражение:

regexp_replace( _tbl::text, '"', '', 'g' )


execute format( 'alter table %s drop constraint if exists %s_pkey', _tbl, regexp_replace( _tbl::text, '"', '', 'g' ) );

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...