DROP TABLE k4_ob;
DROP TABLE k4_rs;
CREATE TABLE k4_ob (id INTEGER, name VARCHAR2(30));
CREATE TABLE k4_rs (id INTEGER, name VARCHAR2(30), id_ob INTEGER);
INSERT INTO k4_ob (id, name) VALUES (1, 'ob1');
INSERT INTO k4_ob (id, name) VALUES (2, 'ob2');
INSERT INTO k4_ob (id, name) VALUES (3, 'ob3');
INSERT INTO k4_rs (id, name, id_ob) VALUES (1, 'rs1', 1);
INSERT INTO k4_rs (id, name, id_ob) VALUES (2, 'rs2', 1);
INSERT INTO k4_rs (id, name, id_ob) VALUES (3, 'rs3', 2);
INSERT INTO k4_rs (id, name, id_ob) VALUES (4, 'rs4', 1);
INSERT INTO k4_rs (id, name, id_ob) VALUES (5, 'rs5', 3);
CREATE OR REPLACE PROCEDURE k4_set_ob (id_rs IN INTEGER, id_oba IN INTEGER) AS
BEGIN
UPDATE k4_rs SET id_ob = id_oba WHERE id = id_rs;
END;
/
CREATE OR REPLACE PROCEDURE k4_del_ob (id_rs IN INTEGER) AS
BEGIN
UPDATE k4_rs SET id_ob = NULL WHERE id = id_rs;
END;
/
CREATE OR REPLACE TRIGGER k4_on_update_rs
before UPDATE ON k4_rs
FOR each ROW
DECLARE
self_user VARCHAR2(30);
invalid_user EXCEPTION;
after_day15 EXCEPTION;
BEGIN
IF :NEW.id_ob IS NULL THEN
DBMS_OUTPUT.put_line('Deleting rs from ob');
SELECT owner INTO self_user FROM all_tables WHERE table_name = 'K3_VS';
IF self_user <> USER THEN
DBMS_OUTPUT.put_line('fail');
RAISE invalid_user;
ELSE
DBMS_OUTPUT.put_line('ok');
END IF;
ELSE
DBMS_OUTPUT.put_line('Add rs to ob');
IF EXTRACT(DAY FROM SYSDATE) > 15 THEN
DBMS_OUTPUT.put_line('fail');
RAISE after_day15;
ELSE
DBMS_OUTPUT.put_line('ok');
END IF;
END IF;
EXCEPTION
WHEN invalid_user THEN
DBMS_OUTPUT.put_line('Invalid user');
WHEN after_day15 THEN
DBMS_OUTPUT.put_line('Deletin after 15 day is denied');
END;
/
CREATE OR REPLACE PACKAGE k4_pak IS
PROCEDURE show_rs (id_oba IN INTEGER);
END k4_pak;
/
CREATE OR REPLACE PACKAGE BODY k4_pak IS
PROCEDURE show_rs (id_oba IN INTEGER) IS
TYPE type_sub_tbl_rs IS TABLE OF VARCHAR2(30);
rss type_sub_tbl_rs := type_sub_tbl_rs();
CURSOR cur (id_obb INTEGER) IS
SELECT ROWNUM AS it, name AS name
FROM k4_rs
WHERE id_ob = id_obb;
BEGIN
FOR cc IN cur(id_oba) LOOP
rss.extend;
rss(cc.it) := cc.name;
END LOOP;
DBMS_OUTPUT.put_line('Extracted rss:');
FOR it IN rss.FIRST .. rss.LAST LOOP
DBMS_OUTPUT.put_line(rss(it));
END LOOP;
END show_rs;
END k4_pak;
/
BEGIN
k4_del_ob(4);
k4_set_ob(4, 1);
k4_pak.show_rs(1);
END;
/