我已经创建了一个触发器函数来动态创建表,这里是:
declare
tipo smallint;
tamanho smallint;
nome character varying(100);
cur_atri cursor for select atri_nome, atri_tipo, tamanho from atributo where colecao = new.col_id;
colecao_nome text := 'marcacao_'||new.col_nome;
query text;
begin
if new.col_aprovada is true and old.col_aprovada is false then
open cur_atri;
query := 'create table '||colecao_nome||' (id serial not null, colecao integer not null references public.colecao (col_id), primary key (id))';
execute query;
loop
fetch cur_atri into nome, tipo, tamanho;
exit when not found;
if tipo = 0 then query := 'alter table '||colecao_nome||' add column '||nome||' integer';
elsif tipo = 1 then query := 'alter table '||colecao_nome||' add column '||nome||' character varying '||tamanho||;
elsif tipo = 2 then query := 'alter table '||colecao_nome||' add column '||nome||' boolean';
elsif tipo = 3 then query := 'alter table '||colecao_nome||' add column '||nome||' real';
elsif tipo = 4 then query := 'alter table '||colecao_nome||' add collumn '||nome||' bytea';
end if;
execute query;
end loop;
close cur_atri;
end if;
end;
触发器激活后,我的网站会显示此错误:
消息:pg_query():查询失败:ERROR:运算符不存在:text ||第1行:......我||'添加列' || nome ||'字符变化' || tamanho || ^提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。 QUERY:SELECT' alter table' || colecao_nome ||'添加列' || nome ||'字符变化' || tamanho ||语境:PL / pgSQL函数criar_tabela_colecao()第21行分配
我真的不知道造成它的原因。
答案 0 :(得分:1)
尝试使用格式,而不是这种连接。像是:
if tipo = 0 then query := format('alter table %I add column %I integer',colecao_nome,nome);
https://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-FORMAT
我将参数值视为 SQL标识符,如果是,则重复引用它 必要。该值为null是错误的(相当于 quote_ident)。
(格式化我的)
答案 1 :(得分:0)
你有一个悬空'||'上
elsif tipo = 1 then query := 'alter table '||colecao_nome||' add column '||nome||' character varying '||tamanho||;
所以将其改为
elsif tipo = 1 then query := 'alter table '||colecao_nome||' add column '||nome||' character varying '||tamanho;