diff --git a/plsql/create_user_if_needed.sql b/plsql/create_user_if_needed.sql new file mode 100644 index 00000000..59078dae --- /dev/null +++ b/plsql/create_user_if_needed.sql @@ -0,0 +1,7 @@ +PROMPT Creating User 'DOJO' +DROP USER dojo; +CREATE USER dojo IDENTIFIED BY pass + DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE temp; + GRANT RESOURCE TO dojo; + GRANT CONNECT TO dojo; +/ diff --git a/plsql/item.sql b/plsql/item.sql new file mode 100644 index 00000000..199acd73 --- /dev/null +++ b/plsql/item.sql @@ -0,0 +1,9 @@ +PROMPT Creating Table 'ITEM' +DROP TABLE item; +CREATE TABLE item + ( + name VARCHAR2(100) NOT NULL, + sell_in NUMBER(6) NOT NULL, + quality NUMBER(6) NOT NULL + ); +/ diff --git a/plsql/item_with_id.sql b/plsql/item_with_id.sql new file mode 100644 index 00000000..7d78aedf --- /dev/null +++ b/plsql/item_with_id.sql @@ -0,0 +1,31 @@ +PROMPT Creating Table 'ITEM' with auto-increment primary key 'ID' +DROP TABLE item; +CREATE TABLE item + ( + id NUMBER(6) NOT NULL, + name VARCHAR2(100) NOT NULL, + sell_in NUMBER(6) NOT NULL, + quality NUMBER(6) NOT NULL + ); +/ + +ALTER TABLE item ADD ( + CONSTRAINT item_pk PRIMARY KEY (ID)); +/ + +DROP SEQUENCE item_id_seq; +CREATE SEQUENCE item_id_seq + INCREMENT BY 1 + START WITH 1 + MAXVALUE 999999 + MINVALUE 1 + NOCYCLE; +/ + +CREATE OR REPLACE TRIGGER item_bis_trg + BEFORE INSERT ON item + FOR EACH ROW +BEGIN + SELECT item_id_seq.NEXTVAL INTO :new.id FROM dual; +END; +/ diff --git a/plsql/texttest_fixture.sql b/plsql/texttest_fixture.sql new file mode 100644 index 00000000..ce56ff25 --- /dev/null +++ b/plsql/texttest_fixture.sql @@ -0,0 +1,35 @@ +DELETE FROM item; + +INSERT INTO item (name, sell_in, quality) VALUES ('+5 Dexterity Vest', 10, 20); +INSERT INTO item (name, sell_in, quality) VALUES ('Aged Brie', 2, 0); +INSERT INTO item (name, sell_in, quality) VALUES ('Elixir of the Mongoose', 5, 7); +INSERT INTO item (name, sell_in, quality) VALUES ('Sulfuras, Hand of Ragnaros', 0, 80); +INSERT INTO item (name, sell_in, quality) VALUES ('Sulfuras, Hand of Ragnaros', -1, 80); +INSERT INTO item (name, sell_in, quality) VALUES ('Backstage passes to a TAFKAL80ETC concert', 15, 20); +INSERT INTO item (name, sell_in, quality) VALUES ('Backstage passes to a TAFKAL80ETC concert', 10, 49); +INSERT INTO item (name, sell_in, quality) VALUES ('Backstage passes to a TAFKAL80ETC concert', 5, 49); +-- this conjured item does not work properly yet ; +INSERT INTO item (name, sell_in, quality) VALUES ('Conjured Mana Cake', 3, 6); +COMMIT; + +DECLARE + l_days NUMBER(3); + CURSOR c_items IS + SELECT name, sell_in, quality FROM item; + l_item c_items%ROWTYPE; +BEGIN + DBMS_OUTPUT.PUT_LINE('OMGHAI!'); + + l_days := 2; + + FOR i IN 0 .. l_days - 1 + LOOP + DBMS_OUTPUT.PUT_LINE('-------- day ' || TO_CHAR(i) || ' --------'); + DBMS_OUTPUT.PUT_LINE('name, sellIn, quality'); + FOR l_item IN c_items LOOP + DBMS_OUTPUT.PUT_LINE(l_item.name || ', ' || l_item.sell_in || ', ' || l_item.quality); + END LOOP; + DBMS_OUTPUT.PUT_LINE(''); + update_quality(); + END LOOP; +END; diff --git a/plsql/update_quality.sql b/plsql/update_quality.sql new file mode 100644 index 00000000..c1f2febe --- /dev/null +++ b/plsql/update_quality.sql @@ -0,0 +1,66 @@ +CREATE OR REPLACE PROCEDURE update_quality +IS + CURSOR c_items IS + SELECT name, sell_in, quality FROM item FOR UPDATE; + l_item c_items%ROWTYPE; + l_name item.name%TYPE; + l_sell_in item.sell_in%TYPE; + l_quality item.quality%TYPE; +BEGIN + FOR l_item IN c_items + LOOP + l_name := l_item.name; + l_sell_in := l_item.sell_in; + l_quality := l_item.quality; + + IF l_name != 'Aged Brie' AND l_name != 'Backstage passes to a TAFKAL80ETC concert' THEN + IF l_quality > 0 THEN + IF l_name != 'Sulfuras, Hand of Ragnaros' THEN + l_quality := l_quality - 1; + END IF; + END IF; + ELSE + IF (l_quality < 50) THEN + l_quality := l_quality + 1; + IF l_name = 'Backstage passes to a TAFKAL80ETC concert' THEN + IF l_sell_in < 11 THEN + IF l_quality < 50 THEN + l_quality := l_quality + 1; + END IF; + END IF; + IF l_sell_in < 6 THEN + IF l_quality < 50 THEN + l_quality := l_quality + 1; + END IF; + END IF; + END IF; + END IF; + END IF; + + IF l_name != 'Sulfuras, Hand of Ragnaros' THEN + l_sell_in := l_sell_in - 1; + END IF; + + IF l_sell_in < 0 THEN + IF l_name != 'Aged Brie' THEN + IF l_name != 'Backstage passes to a TAFKAL80ETC concert' THEN + IF l_quality > 0 THEN + IF l_name != 'Sulfuras, Hand of Ragnaros' THEN + l_quality := l_quality - 1; + END IF; + END IF; + ELSE + l_quality := l_quality - l_quality; + END IF; + ELSE + IF l_quality < 50 THEN + l_quality := l_quality + 1; + END IF; + END IF; + END IF; + + UPDATE item + SET name = l_name, sell_in = l_sell_in, quality = l_quality WHERE CURRENT OF c_items; + END LOOP; +END update_quality; +/