运营商不存在Postgres

时间:2018-01-08 12:48:57

标签: sql postgresql plpgsql database-trigger

我已经创建了一个触发器函数来动态创建表,这里是:

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行分配

我真的不知道造成它的原因。

2 个答案:

答案 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;