日期:2014-05-16  浏览次数:20776 次

谁能帮我编一个触发器函数(PostgreSQL)
我有一个表,人为控制记录为100行,有一个级别列分为5个级别(赋值0,1,2,3,4),分别控制在50行,10行,10行,10行,10行(在总行不超过100行时允许各级别超出限制),现在要写一个触发器,在插入第101条数据时,按级别删除已有数据,使每个级别都要在规定行数之内。

各位高人帮帮我想想怎么写这个触发器???


  id severity
  1 0
  2 0
  3 0
…………
  13 0
  14 1
…………
…………
  100 4


由于plpgsql语言不能嵌套,实在是想不出来怎样实现了,各位帮忙想想,先谢谢了!!!

------解决方案--------------------
探讨
其实实现过程我知道,就是函数不会写,plpgsql语言不能嵌套,而我想的需要if中套一层if,怎样能够实现这样一个逻辑呢???
希望高手指点!!!

------解决方案--------------------
PostgreSQL 8.4.0 Documentation手册中的例子。可以嵌套啊。

SQL code
IF demo_row.sex = 'm' THEN
    pretty_sex := 'man';
ELSE
    IF demo_row.sex = 'f' THEN
        pretty_sex := 'woman';
    END IF;
END IF;

------解决方案--------------------
晕,你看什么帖子说的?
我看的是PostgreSQL文档哦,摘里面的相关内容如下,你参考下吧:

35.7.2. 条件
IF 语句让你可以根据某种条件执行命令。 PL/pgSQL有五种形式的IF: 



IF ... THEN

IF ... THEN ... ELSE

IF ... THEN ... ELSE IF

IF ... THEN ... ELSIF ... THEN ... ELSE

IF ... THEN ... ELSEIF ... THEN ... ELSE


35.7.2.1. IF-THEN
IF boolean-expression THEN
statements
END IF;
IF-THEN语句是IF的最简单形式。如果条件为真, 在THEN和END IF之间的语句将被执行。 否则,将忽略它们。 

例子: 

IF v_user_id <> 0 THEN
UPDATE users SET email = v_email WHERE user_id = v_user_id;
END IF;

35.7.2.2. IF-THEN-ELSE
IF boolean-expression THEN
statements
ELSE
statements
END IF;
IF-THEN-ELSE语句增加了IF-THEN的分支, 让你可以声明在条件计算结果为假的时候执行的语句。 

例子: 

IF parentid IS NULL OR parentid = ''
THEN 
RETURN fullname;
ELSE
RETURN hp_true_filename(parentid) || '/' || fullname;
END IF;

IF v_count > 0 THEN 
INSERT INTO users_count(count) VALUES(v_count);
RETURN 't';
ELSE 
RETURN 'f';
END IF;

35.7.2.3. IF-THEN-ELSE IF
IF语句可以嵌套并且在下面的例子中: 

IF demo_row.sex = 'm' THEN
pretty_sex := 'man';
ELSE
IF demo_row.sex = 'f' THEN
pretty_sex := 'woman';
END IF;
END IF;

如果你使用这种形式,那么你实际上就是在另外一个IF语句的ELSE 部分嵌套了一个IF语句.因此你需要一个END IF语句 给每个嵌套的IF,另外还要一个给父IF-ELSE用. 这么干是可以的,但是如果我们有太多候选项需要检查,那么就会变得很乏味. 因此有下面的形式。 

35.7.2.4. IF-THEN-ELSIF-ELSE
IF boolean-expression THEN
statements
[ ELSIF boolean-expression THEN
statements
[ ELSIF boolean-expression THEN
statements
...]]
[ ELSE
statements ]
END IF;
IF-THEN-ELSIF-ELSE提供了一种更方便的方法用于在一条语句中检查许多候选条件。 形式上它和嵌套的IF-THEN-ELSE-IF-THEN命令相同, 但是只需要一个END IF。 

这里是一个例子: 

IF number = 0 THEN
result := 'zero';
ELSIF number > 0 THEN
result := 'positive';
ELSIF number < 0 THEN
result := 'negative';
ELSE
-- 另外一个唯一的可能是它是空值
result := 'NULL';
END IF;

35.7.2.5. IF-THEN-ELSEIF-ELSE
ELSEIF 是 ELSIF 的别名。 


------解决方案--------------------
引用我上次看到一个帖子说不能够嵌套的,那我可以这样写吗?

------解决方案--------------------


实践如下。


SQL code
csdn=# CREATE FUNCTION sp_shanhengshu(t integer)  RETURNS integer AS $$
csdn$# BEGIN
csdn$#
csdn$#  IF t > 0
csdn$#  THEN
csdn$#      RETURN 1;
csdn$#  ELSE
csdn$#          IF t < 0
csdn$#          THEN
csdn$#              RETURN -1;
csdn$#          ELSE
csdn$#              RETURN 0;
csdn$#