我有存储过程:
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
。
如何设置不带引号的格式?
答案 0 :(得分:0)
似乎通过正则表达式找到了解决方案:
regexp_replace( _tbl::text, '"', '', 'g' )
execute format( 'alter table %s drop constraint if exists %s_pkey', _tbl, regexp_replace( _tbl::text, '"', '', 'g' ) );
我将其用作解决方法,因为这似乎不是正确的方法
答案 1 :(得分:0)
您的第一个错误是创建一个名称为check
(即reserved keyword)的表。
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;