1

I am very new to PL SQL and I am trying to write a Trigger which will fire when a field in Table A is updated, then go and update a field in Table B.

The second table may not have any related records, or it may have many rows (and is this case, I need all the rows to be update).

Depending on what value is updated in Table A (called HNCMA.AGREEMENT_EOI.STATUS), I'd like to effect what is updated in table B (called LMD.LM_ACTIVITY_.ACTIVITY_STATUS_CODE).

This is what I've got so far, but I am getting this error:

PLS-00103: Encountered the symbol "=" when expecting one of the following: :=.(@%;

Any help would be much appreciated!!!!

Thanks


CREATE OR REPLACE TRIGGER TR_UPDATE_STATUS

AFTER UPDATE OF STATUS ON HNCMA.AGREEMENTS_EOI
FOR EACH ROW 

DECLARE

VarStatus Varchar(10);
VarStatusCode Int;

BEGIN

if :new.Status = 'Proposed' then VarStatus = 2 else
if :new.Status = 'Recommended' then VarStatus = 5 else
if :new.Status = 'Funded' then VarStatus = 5 else
if :new.Status = 'Completed' then VarStatus = 6 else
if :new.Status = 'Withdrawn' then VarStatus = 34 
end if

UPDATE
(SELECT LMD.LM_ACTIVITY.ACTIVITY_STATUS_CODE
FROM (HNCMA.AGREEMENTS_EOI INNER JOIN HNCMA.PROJECT ON HNCMA.AGREEMENTS_EOI.PROJECTID = HNCMA.PROJECT.PROJECTID) INNER JOIN (LMD.LM_POLYGON_PROJECT_REL INNER JOIN LMD.LM_ACTIVITY ON LMD.LM_POLYGON_PROJECT_REL.LMID = LMD.LM_ACTIVITY.LMID) ON HNCMA.AGREEMENTS_EOI.CASENO = LMD.LM_POLYGON_PROJECT_REL.LOCAL_PROJECT_NAME
WHERE (((HNCMA.PROJECT.CATCHMENT)='Murray') AND ((HNCMA.AGREEMENTS_EOI.CASENO)= :old.CASENO ));) s
Set s.ACTIVITY_STATUS_CODE = varstatuscode


End;

UPDATE*

Thanks @heaps for your help. I've amended my code to include the CASE function and have fixed my formatting errors. This is what I've got so far (and it works when I take out the update statement), but I am now getting an "SQL command not properly ended" error...

Help!?!

CREATE OR REPLACE TRIGGER TR_UPDATE_LMDB_STATUS1

AFTER UPDATE OF STATUS ON HNCMA.AGREEMENTS_EOI
FOR EACH ROW 

DECLARE

VarStatus Varchar(50);
VarStatusCode Int;

BEGIN

VarStatus := :new.status;

CASE varstatus

WHEN 'Proposed' THEN VarstatusCode := 2;
WHEN 'Recommended' THEN VarStatusCode := 5;
WHEN 'Funded' THEN VarStatusCode := 5;
WHEN 'Completed' THEN VarStatusCode := 6;
WHEN 'Withdrawn' THEN VarStatusCode := 34;

END CASE;

UPDATE LMD.LM_ACTIVITY
SET ACTIVITY_STATUS_CODE = VarStatusCode
FROM (HNCMA.AGREEMENTS_EOI INNER JOIN HNCMA.PROJECT ON HNCMA.AGREEMENTS_EOI.PROJECTID = HNCMA.PROJECT.PROJECTID) INNER JOIN (LMD.LM_POLYGON_PROJECT_REL INNER JOIN LMD.LM_ACTIVITY ON LMD.LM_POLYGON_PROJECT_REL.LMID = LMD.LM_ACTIVITY.LMID) ON HNCMA.AGREEMENTS_EOI.CASENO = LMD.LM_POLYGON_PROJECT_REL.LOCAL_PROJECT_NAME
WHERE (((HNCMA.PROJECT.CATCHMENT)='Murray') AND ((HNCMA.AGREEMENTS_EOI.CASENO)= :old.CASENO )) ;

End;
1

1 Answer 1

1

replace the varstatus=2 with Varstatus:=2 and put a semicolon on end if; and try again

edited.. for your updated question>>

the error SQL command not properly ended is because you should have checked with your UPDATE command

seems problem FROM clause inside the update, as i think its better to try with UPDATE... WHERE EXISTS.. or MERGE command, oracle doesn't support FROM clause in UPDATE, instead you could use it as a query

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.