2017-08-08 161 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';