为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: dm8
【操作系统】:centsos7
【CPU】:
【问题描述】*:
我们有一个自定义函数
CREATE OR REPLACE FUNCTION diesel_manage_updated_at(_tbl regclass) RETURNS VOID AS $$
BEGIN
EXECUTE format(‘CREATE TRIGGER set_updated_at BEFORE UPDATE ON %s FOR EACH ROW EXECUTE PROCEDURE diesel_set_updated_at()’, _tbl);
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION diesel_set_updated_at() RETURNS tragger AS $$
BEGIN
IF (
NEW IS DISTINCT FROM OLD AND
NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at
) THEN
NEW.updated_at := current_timestamp;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
需求是需要转换成达梦语法的触发器
我尝试写成:
CREATE OR REPLACE FUNCTION diesel_manage_updated_at(_tbl VARCHAR(50))
RETURN int
AS
v_sex int;
BEGIN
execute immediate 'CREATE TRIGGER SET_ZICHENCHEN_UPDATE BEFORE UPDATE ON '|| _tbl ||
’ FOR EACH ROW EXECUTE PROCEDURE ZICHENCHEN_UPDATE_TEST ';
v_sex := 1;
RETURN v_sex;
END;
CREATE OR REPLACE FUNCTION ZICHENCHEN_UPDATE_TEST(test int DEFAULT NULL)
RETURN int
AS
BEGIN
:new.UPDATE_AT := current_timestamp;
RETURN 1;
END;
但是在使用
SELECT SYSDBA.diesel_manage_updated_at(‘REQUEST_TEST’);
进行调用时会发生报错。
有办法把触发器的表名通过参数插入创建触发器sql吗或者有其他更好的方式来转换吗
1.您的函数只是传入文本表名进行触发器创建语句的拼接后动态执行,逻辑本身并没有问题,DM侧语句FOR EACH之前的单引号似乎有些问题,请提供一下具体报错信息
2.与PG/INFORMIX不同DM中不需要通过TRIGGER CALL PROCEDURE方式来调用,与ORACLE相同可以直接在TRIGGER BODY中写入PLSQL语句,例如
CREATE or replace TRIGGER SET_ZICHENCHEN_UPDATE BEFORE UPDATE ON TEST
FOR EACH ROW
BEGIN
:new.CRTDATE := current_timestamp;
END;