use*_*942 5 postgresql plpgsql database-trigger
我有一个包含两个数据列的表:col1 和 col2。Col1 是文本字段,col2 是时间。Col1 是必需的,col2 不是,因此它的默认值应该为 null。我使用 pgAdmin,它对我来说是全新的,就像 sql 触发器一样。我有以下触发功能代码:
CREATE OR REPLACE FUNCTION schema.table_replace()
RETURNS trigger AS
LANGUAGE 'plpgsql';
$BODY$
BEGIN
(CASE
WHEN NEW.col1='111' THEN NEW.col1='aaa'
WHEN NEW.col1='222' THEN NEW.col1='bbb'
WHEN NEW.col1='333' THEN NEW.col1='ccc'
ELSE NEW.col1='error'
END);
return NEW;
END;
$BODY$
Run Code Online (Sandbox Code Playgroud)
这可能是之前的触发器(只有当前值应该受到影响,而不是所有行):
CREATE TRIGGER schema.table_replace
BEFORE INSERT
ON schema.table
EXECUTE PROCEDURE schema.table_replace();
Run Code Online (Sandbox Code Playgroud)
说实话,我对pgAdmin一无所知,它似乎比编写代码并使用查询工具运行要复杂得多。问题是处理没有第二个值(它是可选的)的情况,在这种情况下,该行的 col2 应该保持不变,并且 SQL 代码也会返回错误。您能否提供一些帮助以使其运行并创建函数和触发器?谢谢。
sti*_*bit 10
CASE作为控制结构以END CASE( 而表达式仅以END)。并且分支中有语句,需要以分号结束。
你的LANGUAGE也放错地方了。那属于最后。而且您不需要单引号。
当不为空时,您可以使用 anIF仅进行替换。col2
CREATE OR REPLACE FUNCTION schema.table_replace()
RETURNS trigger AS
$BODY$
BEGIN
IF NEW.col2 IS NOT NULL THEN
CASE
WHEN NEW.col1 = '111' THEN
NEW.col1 = 'aaa';
WHEN NEW.col1 = '222' THEN
NEW.col1 = 'bbb';
WHEN NEW.col1 = '333' THEN
NEW.col1 = 'ccc';
ELSE
NEW.col1 = 'error';
END CASE;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
您还需要将触发器声明为FOR EACH ROW触发器NEW为工作
并且触发器名称不能是模式限定的。
CREATE TRIGGER table_replace
BEFORE INSERT
ON schema.table
FOR EACH ROW
EXECUTE PROCEDURE schema.table_replace();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21212 次 |
| 最近记录: |