2017-08-08 158 views
0

我在语言'plpgsql'中遇到了sql问题。sql触发器更新并插入

问题是先在客户表中添加一个新的列clean_phone。然后在插入和更新时使用触发器来将clean_phone填充到random_string()函数。这是我做的。

创建新列

alter table customers 
add clean_phone varchar(15); 

触发

create or replace function clean_function() 
returns trigger as 
$$ 
begin 
new.clean_phone = random_string(); 
return new; 
end; 
$$ 
language 'plpgsql'; 

drop trigger clean_phone on customers; 
create trigger clean_phone 
before update or insert 
on customers 
for each row 
execute procedure clean_function(); 

而且最终,显示表

select name,clean_phone from customers; 

我的问题是在我运行的所有代码,并显示结果,clean_phone列仍然没有显示任何内容。那么,我该如何解决这个问题?

+0

你插入或更新表中的东西吗?触发器只在这些情况下被调用。 –

+0

我试图插入/更新任何东西,但它显示错误,说明clean_phone不存在 – youlingjun0505

+0

错误:值变得太长,因为类型字符变化(15) SQL状态:22001 上下文:PL/pgSQL函数clean_function()第3行 – youlingjun0505

回答

0

请首先检查random_string()函数存在或不使用: -

选择random_string();

如果你得到的结果,请让我知道,因为它在我的最后工作正常。

0

使用此代码: -

Create or replace function random_string(length integer) returns text as

$$

declare chars text[] := '{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}';

result text := '';

i integer := 0;

begin

if length < 0 then

raise exception 'Given length cannot be less than 0';

end if; for i in 1..length loop

result := result || chars[1+random()*(array_length(chars, 1)-1)];

end loop;

return result;

end;

$$ language plpgsql;

create or replace function clean_function() 
returns trigger as 
$$ 
    begin 
     new.clean_phone = random_string(15); 
     return new; 
    end; 
$$ 
language 'plpgsql';