Question

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?

Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top