建议写成带输入参数的游标;
...
for each row
DECLARE
   CURSOR radacct_cursor(p_username varchar2) IS 
          SELECT SUM(acctsessiontime) sum_acctsessiontime 
            FROM radacct 
            WHERE   username = p_username;
   CURSOR radreply_cursor(p_username varchar2) is
          SELECT value 
            FROM radreply 
            WHERE attribute ='acctsessiontime' 
            and username = p_username;         rad_val number(12,0);;
radreply_value_NUM number(12,0);

BEGIN
OPEN radacct_cursor(:new.username); 
fetch radacct_cursor into rad_val; open radreply_cursor(:new.username); 
fetch radreply_cursor into radreply_val; /*此处略,不过你在此处缺少循环控制语句,radreply_cursor%FOUND这样的语句常用作,如,loop
           FETCH cur_emp INTO r_emp;
           EXIT WHEN c_emp%NOTFOUND;
              ...........
           END LOOP;
          close cur_emp;
        另外,radacct_cursor%ROWTYPE;主要用作游标取多个字段时用,此处可以不用*/
close radacct_cursor;
close radreply_cursor;
END;

解决方案 »

  1.   

    CURSOR radacct_cursor IS SELECT SUM(acctsessiontime) sum_acctsessiontime FROM radacct WHERE username = :new.username;:new.username的用法不对。CURSOR radacct_cursor(username1 varchar2) IS SELECT SUM(acctsessiontime) sum_acctsessiontime FROM radacct WHERE username = username1;OPEN radacct_cursor(:new.username);
      

  2.   

    谢谢二位,问题已经找到了,是触发器不能在after命令中对自己那个表执行select,update 或delete操作,改成before就可以了.
      

  3.   

    哦,原来如此,oracle触发器中的确不允许对变异表(mutating table)进行操作,
    谁叫你把关键的create ...on ....那几行语句给截掉了,呵呵