2013-05-14 2 views
0

Я хотел бы сделать копию строки в одной таблице, адресованной поле в другой таблице, например:как обойти отсутствует тип записи на вставке

CREATE OR REPLACE FUNCTION f_ins_up_vorb() 
RETURNS TRIGGER AS $$ 
DECLARE 
    dienst  dienst%ROWTYPE; 
    account  record; 
BEGIN 
    -- ... 
    EXECUTE format('SELECT * FROM %s WHERE id=$1',dienst.tabelle) 
    USING NEW.id INTO account; 
    EXECUTE 'INSERT INTO ' || dienst.tabelle || 'shadow SELECT ($1).*, now(), $2' USING account, jobid; 
    RETURN NEW; 
END 
$$ LANGUAGE plpgsql; 

Но это дает:

ERROR: record type has not been registered 
CONTEXT: SQL statement "INSERT INTO accountadshadow SELECT ($1).*, now(), $2" 
PL/pgSQL function f_ins_up_vorb() line 30 at EXECUTE statement 

таблицы решаемых dienst.tabelle не имеет общий типа, но целевую таблица (dienst.tabelle || 'shadow') всегда надмножество исходной таблицы. Таким образом, это всегда должно работать (и делает работы в функции запуска, где я использую NEW, который, похоже, имеет тип записи).

Есть ли способ обойти это?

ответ

2

Попробуйте что-то вроде:

CREATE OR REPLACE FUNCTION f_ins_up_vorb() 
RETURNS TRIGGER AS $$ 
DECLARE 
    dienst  dienst%ROWTYPE; 
BEGIN 
    -- ... 
    EXECUTE 'INSERT INTO '||dienst.tabelle||'shadow 
      SELECT *, now(), $2 
      FROM '||dienst.tabelle||' 
      WHERE id=$1' 
    USING NEW.id, jobid; 
    RETURN NEW; 
END 
$$ LANGUAGE plpgsql; 

Если вы пытаетесь создать какой-то триггер журнала - читать this страницу первым.

Смежные вопросы