Cursor Error in trigger - Statement Ignored/identifier must be declared PLS
795782Sep 3 2010 — edited Sep 3 2010I have been asked to implement a trigger and believe I have the code complete but am getting a final error on the compile. I have been running in circles for a day trying to resolve my issue. I have no PL/SQL knowlege so have been pulling from a book and google. I have three Cursors defined and the third compiles fine, the first two give the below error though I can't see a significant difference between the three. I can't help but think it is something stupid I am not seeing but I am at a loss.
If I comment out the reference to the cursor it will compile with the cursor definition but as soon as I add the Open statement the errors below appear.
Any help would be greatly appreciated as my head is getting sore.
Thanks
Mike
Error(30,13): PL/SQL: Statement ignored
Error(30,20): PLS-00201: identifier 'CURSORGETFROMDISTMAKRERS' must be declared
Error(51,13): PL/SQL: Statement ignored
Error(51,20): PLS-00201: identifier 'CURSORGETTODISTMAKRERS' must be declared
-- Table I am writing to
create table IMSV7.CTRANSWODISTMARK (
WORKORDERKEY INTEGER,
DISTMARKFROM NUMBER (9,4),
DISTMARKFROMATTRIBUTE VARCHAR (10),
DISTMARKTO NUMBER (9,4),
DISTMARKTOATTRIBUTE VARCHAR (10)
);
-- Excerpt from the HISTORY table I am placing the trigger against
COMPKEY NUMBER (9,0)
DISTFROMFT FLOAT
DISTTOFT FLOAT
HISTKEY NUMBER (9,0)
-- Trigger code
CREATE OR REPLACE TRIGGER MaintainCTRANSWODISTMARK
AFTER INSERT or UPDATE of DISTFROMFT, DISTTOFT ON IMSV7.HISTORY
REFERENCING NEW as NewWO
FOR EACH ROW
BEGIN
DECLARE
-- Declare cursors
CURSOR CursorGetFromDistMarkers (WOCompKey IN NUMBER, WODistFromFT IN FLOAT) IS
SELECT ATTRCODE, DISTFROMFT, MARKERFROM from RWATTRDF DF, RWATTR A
where WOCompkey = A.COMPKEY AND DF.ATTRKEY = A.ATTRKEY and DF.ATTRTYPE = 'DISTMARK'
and WODistFromFT >= DISTFROMFT and WODistFromFT <= DISTTOFT
order by A.EFFDATE DESC, DISTFROMFT DESC;
FromDistanceMarker CursorGetFromDistMarkers%ROWTYPE;
CURSOR CursorGetToDistMarkers (WOCompKey IN NUMBER, WODistToFT IN FLOAT) IS
SELECT ATTRCODE, DISTFROMFT, MARKERFROM from RWATTRDF DF, RWATTR A
where WOCompkey = A.COMPKEY AND DF.ATTRKEY = A.ATTRKEY and DF.ATTRTYPE = 'DISTMARK'
and WODistToFT >= DISTFROMFT and WODistToFT <= DISTTOFT
order by A.EFFDATE DESC, DISTFROMFT DESC;
ToDistanceMarker CursorGetToDistMarkers%ROWTYPE;
CURSOR CursorGetCTRANSWODistMark (WOHistKey IN NUMBER) IS
SELECT WORKORDERKEY from CTRANSWODISTMARK
where WORKORDERKEY = WOHistKey;
CTRANSWODistMark CursorGetCTRANSWODistMark%ROWTYPE;
varDistmarkFrom NUMBER;
varDistmarkFromAttribute VARCHAR2(10);
varDistmarkTo NUMBER;
varDistmarkToAttribute VARCHAR2(10);
BEGIN
-- Process From measurement
IF NOT CursorGetFromDistMakrers%ISOPEN
THEN
OPEN CursorGetFromDistMarkers(:NewWO.COMPKEY, :NewWO.DISTFROMFT);
END IF;
FETCH CursorGetFromDistMarkers INTO FromDistanceMarker;
IF CursorGetFromDistMarkers%NOTFOUND
THEN
-- No distance markers found, use MILES
varDistmarkFrom := :NewWO.DISTFROMFT / 5280;
varDistmarkFromAttribute := 'MILES';
ELSE
-- Found a distance marker, convert to its units and use those
-- Distance is the Marker start distance plus the offset from that start of the marker
varDistmarkFrom := FromDistanceMarker.MARKERFROM + :NewWO.DISTFROMFT - FromDistanceMarker.DISTFROMFT;
varDistmarkFromAttribute := FromDistanceMarker.ATTRCODE;
END IF;
CLOSE CursorGetFromDistMarkers;
-- Process To measurement
IF NOT CursorGetToDistMakrers%ISOPEN
THEN
OPEN CursorGetToDistMarkers(:NewWO.COMPKEY, :NewWO.DISTTOFT);
END IF;
FETCH CursorGetToDistMarkers INTO ToDistanceMarker;
IF CursorGetToDistMarkers%NOTFOUND
THEN
-- No distance markers found, use MILES
varDistmarkTo := :NewWO.DISTTOFT / 5280;
varDistmarkToAttribute := 'MILES';
ELSE
-- Found a distance marker, convert to its units and use those
-- Distance is the Marker start distance plus the offset from that start of the marker
varDistmarkTo := ToDistanceMarker.MARKERFROM + :NewWO.DISTTOFT - ToDistanceMarker.DISTFROMFT;
varDistmarkToAttribute := ToDistanceMarker.ATTRCODE;
END IF;
CLOSE CursorGetToDistMarkers;
-- Check for existing record to know if we should add or update
IF NOT CursorGetCTRANSWODistMark%ISOPEN
THEN
OPEN CursorGetCTRANSWODistMark(:NewWO.HISTKEY);
END IF;
FETCH CursorGetCTRANSWODistMark INTO CTRANSWODistMark;
IF CursorGetCTRANSWODistMark%NOTFOUND
THEN
-- Record does not exist, add one
Insert into CTRANSWODISTMARK (WORKORDERKEY, DISTMARKFROM, DISTMARKFROMATTRIBUTE, DISTMARKTO, DISTMARKTOATTRIBUTE)
values (:NewWO.HISTKEY, varDistmarkFrom, varDistmarkFromAttribute, varDistmarkTo, varDistmarkToAttribute);
ELSE
-- Existing record, update it
Update CTRANSWODISTMARK set DISTMARKFROM = varDistmarkFrom, DISTMARKFROMATTRIBUTE = varDistmarkFromAttribute,
DISTMARKTO = varDistmarkTo, DISTMARKTOATTRIBUTE = varDistmarkToAttribute
Where WORKORDERKEY = :NewWO.HISTKEY;
END IF;
END;
END;
.
run;
show errors trigger MaintainCTRANSWODISTMARK;