как перенести эту функцию / триггер из postgres в оракул? - PullRequest
0 голосов
/ 20 сентября 2019

Здравствуйте. Я пытаюсь перенести эту функцию и запустить ее так, чтобы она была полезна в Oracle. У меня есть пара таких действий, я просто ищу какую-то помощь с одной, чтобы я мог без проблем разобраться с остальными.Спасибо за помощь.

CREATE FUNCTION podium_core.entity_tag_sync()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF 
AS $BODY$

BEGIN
insert into podium_core.pd_entity_tag(entity_nid,tag,version,modifiedby, createdby)
select distinct FOO.entity_nid, NEW.tag,0,'trigger','trigger' from
(select entity_nid from podium_core.pd_field where nid in (
select child_field_nid from podium_core.pd_field_pc_rel where parent_field_nid in 
(select max(f.nid) from podium_core.pd_field f join podium_core.pd_entity e on e.nid= f.entity_nid 
where entity_nid=NEW.entity_nid and entity_type='EXTERNAL')))FOO
where NEW.createdby <> 'trigger';
delete from podium_core.pd_entity_tag t1
USING podium_core.pd_entity_tag t2
WHERE t1.nid < t2.nid
AND t1.tag = t2.tag
AND t1.entity_nid = t2.entity_nid;

RETURN NEW;
END;

$BODY$;

ALTER FUNCTION podium_core.entity_tag_sync()
    OWNER TO postgres;

-- Trigger: trigger_entity_tag_sync
-- DROP TRIGGER trigger_entity_tag_sync ON podium_core.pd_entity_tag;

CREATE TRIGGER trigger_entity_tag_sync
    AFTER INSERT
    ON podium_core.pd_entity_tag
    FOR EACH ROW
    EXECUTE PROCEDURE podium_core.entity_tag_sync();

1 Ответ

0 голосов
/ 20 сентября 2019

Итак, я просто переписал ваш код, чтобы он соответствовал синтаксису Oracle, но я сомневаюсь, что он на самом деле сработает для вас - я думаю, что это может вызвать ошибку «таблица мутируется».Удачи.

CREATE OR REPLACE TRIGGER trigger_entity_tag_sync
AFTER INSERT ON podium_core.pd_entity_tag
FOR EACH ROW
BEGIN
    insert into podium_core.pd_entity_tag(entity_nid,tag,version,modifiedby, createdby)
    select distinct FOO.entity_nid, :NEW.tag,0,'trigger','trigger' 
    from
    (select entity_nid 
    from podium_core.pd_field 
    where nid in (
        select child_field_nid 
        from podium_core.pd_field_pc_rel 
        where parent_field_nid in 
            (select max(f.nid) from podium_core.pd_field f join podium_core.pd_entity e on e.nid= f.entity_nid 
            where entity_nid=:NEW.entity_nid and entity_type='EXTERNAL')
        )
    )FOO
    where :NEW.createdby <> 'trigger';

    delete from podium_core.pd_entity_tag t1
    where exists (select 1 from podium_core.pd_entity_tag t2
                    WHERE t1.nid < t2.nid
                    AND t1.tag = t2.tag
                    AND t1.entity_nid = t2.entity_nid);
END;
/
...