2010-04-11 83 views
1

執行以下操作方案爲我的數據庫:如何從INSERT/UPDATE規則(觸發器)執行的函數返回記錄?

create sequence data_sequence; 

create table data_table 
{ 
    id integer primary key; 
    field varchar(100); 
}; 

create view data_view as 
select id, field from data_table; 

create function data_insert(_new data_view) returns data_view as 
$$declare 
    _id integer; 
    _result data_view%rowtype; 
begin 
    _id := nextval('data_sequence'); 
    insert into data_table(id, field) values(_id, _new.field); 
    select * into _result from data_view where id = _id; 
return _result; 
end; 
$$ 
language plpgsql; 

create rule insert as on insert to data_view do instead 
select data_insert(new); 

然後輸入PSQL:

insert into data_view(field) values('abc'); 

想看到的東西,如:

id | field 
----+--------- 
    1 | abc 

而是看到:

data_insert 
------------- 
(1, "abc") 

是否有可能以某種方式解決這個問題?

感謝您的任何想法。

最終的想法是在其他函數中使用它,以便我可以從頭開始選擇插入的記錄的id。喜歡的東西:

insert into data_view(field) values('abc') returning id into my_variable 

將是不錯,但不與錯誤的工作:

ERROR: cannot perform INSERT RETURNING on relation "data_view" 
HINT: You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause. 

我真的不明白的暗示。我使用PostgreSQL 8.4。

回答

5

你想要做的是已經內置到postgres中。它允許你在INSERT語句中包含一個RETURNING子句。

CREATE TABLE data_table (
    id SERIAL, 
    field VARCHAR(100), 
    CONSTRAINT data_table_pkey PRIMARY KEY (id) 
); 

INSERT INTO data_table (field) VALUES ('testing') RETURNING id, field; 

如果你覺得你必須使用一個視圖中,Postgres的纔去任何進一步的郵件列表檢查this thread

+1

謝謝。上面的簡化示例與簡單插入不同。我的邏輯需要在插入調用(實際上,查看而不是普通表)和實際物理插入之間進行一些處理,這種處理還包括決定 - 是否插入。 所以,我想看到的結果是1或沒有記錄有關插入的數據,包括分配的記錄ID。 我試過返回,它給了我一個如上所述的提示。所以,直到我錯過了你的答案 - 我仍然在尋找解決方案。將審查您的鏈接 - 謝謝。 – seas 2010-04-14 17:18:10