2016-02-01 34 views
-1

我有兩個過程更新Postgresql 9.4上的產品及其屬性的以下問題。首先關閉表格:Postgres「無法將非複合值分配給行變量」錯誤分配複合值

CREATE TABLE product 
(
    id uuid NOT NULL, 
    version bigint NOT NULL, 
    is_part_of_import_id uuid, 
    name text NOT NULL, 
    owner_id uuid NOT NULL, 
    replaced_by_id uuid, 
    state character varying(255) NOT NULL, 
    replaces_id uuid, 
    last_update timestamp without time zone, 
    ... 
) 

CREATE TABLE attribute_value 
(
    id uuid NOT NULL, 
    version bigint NOT NULL, 
    last_update timestamp without time zone, 
    product_id uuid NOT NULL, 
    replaced_by_id uuid, 
    replaces_id uuid, 
    value text, 
    ... 
) 

product和attribute_value之間存在一對多關係。我有一個過程來更新ATTRIBUTE_VALUE

CREATE OR REPLACE FUNCTION update_attribute_value(attr_val attribute_value) 
RETURNS UUID AS 
$BODY$ 
    DECLARE new_id UUID; 
BEGIN 
    attr_val.replaces_id := attr_val.id; 
    attr_val.id := uuid_generate_v4(); 
    attr_val.last_update := NOW(); 

    INSERT INTO attribute_value SELECT attr_val.* RETURNING attribute_value.id INTO new_id; 

    UPDATE attribute_value SET replaced_by_id = new_id WHERE id = attr_val.replaces_id; 

    RETURN attr_val.id; 
END; 
$BODY$ 
LANGUAGE plpgsql VOLATILE 

和程序來更新產品調用update_attribute_value_procedure更新產品的所有ATTRIBUTE_VALUES以及

語言PLPGSQL揮發性

當我像這樣運行update_product

select update_product(row('140613c5-3e83-4ae2-986e-5c6b824d5766', 0, '0ba5a6c8-2513-4163-a5bd-c460e10d2059', null, null, 
'ce594f2c-87f9-497a-a0e5-7d3fbc4abd8a', null, 'aeabe6fe-b9e1-47e5-96a7-7bf16c56ddf4', 'Rotak 43 1', 'eaf6bea0-99c4-4759-8c38-d35b9ae11403', null, 
'PENDING', null, null)::product); 

我碰到下面的錯誤輸出:

錯誤:在分配 SQL語句PL/pgSQL函數change_original_attribute_value()第15行「INSERT INTO ATTRIBUTE_VALUE:無法分配非複合值連續可變 SQL狀態:42804 上下文SELECT attr_val。* RETURNING attribute_value.id」 PL/pgSQL函數update_attribute_value(ATTRIBUTE_VALUE)9號線在SQL語句 SQL語句 「SELECT update_attribute_value(attr_val)」 PL/pgSQL函數update_product(產品)管線17,以PERFORM

在這種情況下,這個錯誤對我來說絕對沒有意義。有沒有人有一個想法是什麼錯在這裏,或者這可能是一個錯誤?

回答

0

我發現了錯誤。問題出在插入產品時觸發的函數change_original_attribute_value()中。在那裏調用了一個返回UUID的函數,但是它分配的類型是一個rowtype。