CREATE TABLE Foo (
Foo1ID VARCHAR2(255),
Foo2ID VARCHAR2(255),
FooCategory VARCHAR2(255),
FooValue NUMBER,
PRIMARY KEY (Foo1ID, Foo2ID)
)
Table created.
INSERT INTO Foo VALUES('A','100','Type1',100)
1 row(s) inserted.
INSERT INTO Foo VALUES('A','102','Type2',20)
1 row(s) inserted.
INSERT INTO Foo VALUES('A','104','Type1',54)
1 row(s) inserted.
INSERT INTO Foo VALUES('A','106','Type2',75)
1 row(s) inserted.
INSERT INTO Foo VALUES('B','100','Type1',82)
1 row(s) inserted.
INSERT INTO Foo VALUES('B','102','Type2',33)
1 row(s) inserted.
INSERT INTO Foo VALUES('B','104','Type1',90)
1 row(s) inserted.
INSERT INTO Foo VALUES('B','106','Type2',65)
1 row(s) inserted.
INSERT INTO Foo VALUES('C','100','Type1',71)
1 row(s) inserted.
INSERT INTO Foo VALUES('C','102','Type2',25)
1 row(s) inserted.
INSERT INTO Foo VALUES('C','104','Type1',44)
1 row(s) inserted.
INSERT INTO Foo VALUES('C','106','Type2',93)
1 row(s) inserted.
CREATE OR REPLACE PROCEDURE UpdateFooValue(
p_FooCategory Foo.FooCategory%TYPE
) AS
CURSOR foo_cursor IS
-- Should we include Foo1ID, Foo2ID here ?
SELECT Foo1ID, Foo2ID, FooValue FROM Foo
WHERE Foo.FooCategory = p_FooCategory
FOR UPDATE;
v_FooValue Foo.FooValue%TYPE := 0;
BEGIN
FOR foo_rec IN foo_cursor LOOP
IF foo_rec.FooValue > 50 THEN
v_FooValue := 25;
ELSE
v_FooValue := 10;
END IF;
UPDATE Foo SET FooValue = v_FooValue WHERE CURRENT OF foo_cursor;
END LOOP;
END UpdateFooValue;
Procedure created.
BEGIN
UpdateFooValue('Type1');
COMMIT;
UpdateFooValue('Type2');
COMMIT;
END;
Statement processed.
SELECT * FROM Foo
FOO1ID | FOO2ID | FOOCATEGORY | FOOVALUE | A | 100 | Type1 | 25 | A | 102 | Type2 | 10 | A | 104 | Type1 | 25 | A | 106 | Type2 | 25 | B | 100 | Type1 | 25 | B | 102 | Type2 | 10 | B | 104 | Type1 | 25 | B | 106 | Type2 | 25 | C | 100 | Type1 | 25 | C | 102 | Type2 | 10 | C | 104 | Type1 | 10 | C | 106 | Type2 | 25 |
---|