Using Postgres 9.3. Is it possible to insert a result of a function?

I tried this:

CREATE FUNCTION apply_func() RETURNS TRIGGER AS $$
DECLARE gwa char(9);
BEGIN
gwa:=(select gwa_calc(new.studid));
IF (SELECT noGrade_check(new.studid)) THEN
 RAISE NOTICE 'ACCEPTED: GRADES COMPLETE';
  IF (SELECT yrlvl_check(new.studid)) THEN 
    RAISE NOTICE 'ACCEPTED:YRLVL_CHECK';
     IF (SELECT fail_check1(new.studid, new.sch_name)) THEN
       RAISE NOTICE 'ACCEPTED:FAIL_CHECK';
         IF (SELECT semunit_check1(new.studid)) THEN
           RAISE NOTICE 'ACCEPTED:UNIT_CHECK';
             IF (SELECT gwa_check(new.studid, new.sch_name)) THEN
                RAISE NOTICE 'ACCEPTED:GWA_CHECK';
                INSERT INTO apply(studid, sch_name, gpa)
                VALUES (new.studid, new.sch_name, gwa);
                RETURN NEW;
             ELSE
               RAISE NOTICE 'DECLINED:GPA_CHECK';
                 RETURN NULL;
             END IF;
         ELSE
           RAISE NOTICE 'DECLINED:UNIT_CHECK';
             RETURN NULL;
         END IF;
     ELSE
       RAISE NOTICE 'DECLINED:FAIL_CHECK';
         RETURN NULL;
     END IF;
  ELSE 
    RAISE NOTICE 'DECLINED:YRLVL_CHECK';
      RETURN NULL;
  END IF;
ELSE
 RAISE NOTICE 'DECLINED: NULL GRADE EXISTS';
   RETURN NULL;
END IF;

END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER apply_trig
BEFORE INSERT ON apply
FOR EACH ROW EXECUTE PROCEDURE apply_func();

I want the to automatically insert new.studid, new.sch_name and the result of the function gwa_calc(new.studid) after all the other requirements needed for the scholarship are met.

How do I do that?

有帮助吗?

解决方案

Simplify your code in various ways:

CREATE FUNCTION apply_func()
  RETURNS trigger AS
$func$
BEGIN

IF NOT noGrade_check(NEW.studid) THEN
   RAISE NOTICE 'DECLINED: NULL GRADE EXISTS';
ELSIF NOT yrlvl_check(NEW.studid) THEN 
   RAISE NOTICE 'DECLINED:YRLVL_CHECK';
ELSIF NOT fail_check1(NEW.studid, new.sch_name) THEN
   RAISE NOTICE 'DECLINED:FAIL_CHECK';
ELSIF NOT semunit_check1(NEW.studid) THEN
   RAISE NOTICE 'DECLINED:UNIT_CHECK';
ELSIF NOT gwa_check(NEW.studid, NEW.sch_name) THEN
   RAISE NOTICE 'DECLINED:GPA_CHECK';
ELSE
   NEW.gpa := gwa_calc(NEW.studid);
   RETURN NEW;
END IF;

RETURN NULL;

END;
$func$ LANGUAGE plpgsql;

The INSERT happens automatically as long as you RETURN NEW. Don't duplicate it, that would result in an endless loop.

I suggest you invert the logic of your tests, so you can simplify and drop all the negations. If you don't need all those notices, this can be simplified further.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top