commit 9bffb572c38c3d1bf9929be65a8bc3540e29c4e8 Author: Sherwin Price Date: Sat Mar 28 09:51:56 2026 -0400 initial diff --git a/schema/Price_Sherwin_DDL.sql b/schema/Price_Sherwin_DDL.sql new file mode 100755 index 0000000..1aa97ee --- /dev/null +++ b/schema/Price_Sherwin_DDL.sql @@ -0,0 +1,565 @@ +-- CREATE SCHEMA +/* +DROP USER "C##ART" CASCADE; + +CREATE USER "C##ART" IDENTIFIED BY Welcome123; + +GRANT connect, resource, DBA to "C##ART"; +*/ + +-- ORACLE SQL SCHEMA DDL: + +-- DROP TABLES FIRST; IF EXIST +SET ECHO ON; +SET SERVEROUTPUT ON; + +DECLARE + l_tab DBMS_UTILITY.uncl_array; + l_tablen number; + BEGIN + dbms_utility.comma_to_table('CONTACT,PROFILE,ROLE,USERROLE,STAFF,ZIP,ADDRESS,DOCUMENT,PLAN,EXHIBIT,SUBSCRIPTION,AUTHORIZATION,INVENTORY,ORDER_ITEMS,INVOICE,TASK_HISTORY' + , l_tablen, l_tab); + for i in 1..l_tablen + LOOP + BEGIN + EXECUTE IMMEDIATE 'DROP TABLE ' || l_tab(i) || ' CASCADE CONSTRAINTS'; + DBMS_OUTPUT.put_line('DROPPED ' || l_tab(i) ); + EXCEPTION + WHEN OTHERS THEN NULL; + END; + END LOOP; + + DBMS_UTILITY.comma_to_table('ISEQ_CONTACT,ISEQ_ROLE,ISEQ_PROFILE,ISEQ_DOCUMENT', l_tablen, l_tab); + for i in 1..l_tablen + LOOP + BEGIN + EXECUTE IMMEDIATE 'DROP SEQUENCE '|| l_tab(i); + DBMS_OUTPUT.put_line('DROPPED ' || l_tab(i) ); + EXCEPTION + WHEN OTHERS THEN NULL; + END; + END LOOP; + + COMMIT; + END; +/ + +CREATE SEQUENCE ISEQ_CONTACT START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; + +CREATE TABLE CONTACT ( + CONTACT_ID NUMBER DEFAULT ISEQ_CONTACT.nextval NOT NULL, + FIRST_NAME VARCHAR2(16) NOT NULL, + LAST_NAME VARCHAR2(16) NOT NULL, + PHONE_NO VARCHAR2(12), + EMAIL VARCHAR2(64) NOT NULL, + MODIFIED_BY NUMBER, + CREATED_DT TIMESTAMP DEFAULT SYSDATE, + MODIFIED_DT TIMESTAMP DEFAULT SYSDATE, + CONSTRAINT PK_CONTACT_ID PRIMARY KEY (CONTACT_ID), + FOREIGN KEY (MODIFIED_BY) REFERENCES CONTACT(CONTACT_ID) +); + +CREATE TABLE ZIP ( + ZIP VARCHAR2(5), + CITY VARCHAR2(16), + STATE VARCHAR2(2), + CONSTRAINT PK_ZIP PRIMARY KEY (ZIP), + CONSTRAINT ZIP_CHECK CHECK ( REGEXP_LIKE(ZIP, '\d{5}') ) +); + +CREATE TABLE ADDRESS ( + ZIP VARCHAR2(5) NOT NULL, + FK_CONTACT_ID NUMBER NOT NULL, + STREET VARCHAR2(32) NOT NULL, + CONSTRAINT PK_ADDRESS PRIMARY KEY (ZIP, FK_CONTACT_ID), + FOREIGN KEY (FK_CONTACT_ID) REFERENCES CONTACT(CONTACT_ID) ON DELETE CASCADE, + FOREIGN KEY (ZIP) REFERENCES ZIP(ZIP) +); + +CREATE SEQUENCE "ISEQ_ROLE" START WITH 100 INCREMENT BY 100 NOCACHE NOCYCLE; + +CREATE TABLE ROLE ( + ROLE_ID NUMBER DEFAULT ISEQ_ROLE.nextval NOT NULL, + ROLENAME VARCHAR2(16), + CONSTRAINT PK_ROLE_ID PRIMARY KEY (ROLE_ID), + CONSTRAINT check_role CHECK (ROLENAME IN ('SYSTEM', 'CONTACT', 'CUSTOMER', 'STAFF', 'SUPPLIER')) +); + +CREATE SEQUENCE "ISEQ_PROFILE" START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; + +CREATE TABLE PROFILE ( + PROFILE_ID NUMBER DEFAULT ISEQ_PROFILE.nextval NOT NULL, + FK_CONTACT_ID NUMBER NOT NULL, + ACTIVE BOOLEAN DEFAULT FALSE, + MODIFIED_BY NUMBER NOT NULL, + CREATED_DT TIMESTAMP DEFAULT SYSDATE, + MODIFIED_DT TIMESTAMP DEFAULT SYSDATE, + CONSTRAINT PK_PROFILE_ID PRIMARY KEY(PROFILE_ID), + FOREIGN KEY (FK_CONTACT_ID) REFERENCES CONTACT(CONTACT_ID) ON DELETE CASCADE, + FOREIGN KEY(MODIFIED_BY) REFERENCES PROFILE(PROFILE_ID) +); + +CREATE TABLE USERROLE ( + FK_PROFILE_ID NUMBER NOT NULL, + FK_ROLE_ID NUMBER NOT NULL, + PASSWORDHASH RAW(256) DEFAULT NULL, + CONSTRAINT PK_USERROLE PRIMARY KEY (FK_ROLE_ID,FK_PROFILE_ID), + FOREIGN KEY(FK_PROFILE_ID) REFERENCES PROFILE(PROFILE_ID) ON DELETE CASCADE, + FOREIGN KEY(FK_ROLE_ID) REFERENCES ROLE(ROLE_ID) ON DELETE CASCADE +); + +CREATE TABLE STAFF( + FK_PROFILE_ID NUMBER NOT NULL, + POSITION VARCHAR2(14) NOT NULL, + CONSTRAINT check_position CHECK (POSITION IN ('Director', 'Curator', + 'Art Handler', 'Registrar', 'Associate')), + CONSTRAINT PK_STAFF PRIMARY KEY (FK_PROFILE_ID), + FOREIGN KEY(FK_PROFILE_ID) REFERENCES PROFILE(PROFILE_ID) +); + +CREATE SEQUENCE ISEQ_DOCUMENT START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; +CREATE TABLE DOCUMENT ( + DOCUMENT_ID NUMBER DEFAULT ISEQ_DOCUMENT.nextval NOT NULL, + DOCUMENT_URL VARCHAR2(254) NOT NULL, + CONSTRAINT PK_DOCUMENT PRIMARY KEY (DOCUMENT_ID) +); + +CREATE TABLE PLAN ( + PLAN_ID NUMBER GENERATED ALWAYS AS IDENTITY, + DESCRIPTION VARCHAR2(32), + FK_DOCUMENT_ID NUMBER NOT NULL, + Duration NUMBER, --in hours + price NUMBER, + MODIFIED_BY NUMBER, + CREATED_DT TIMESTAMP DEFAULT SYSDATE, + MODIFIED_DT TIMESTAMP DEFAULT SYSDATE, + CONSTRAINT PK_PLAN PRIMARY KEY(PLAN_ID), + FOREIGN KEY(FK_DOCUMENT_ID) REFERENCES DOCUMENT(DOCUMENT_ID) +); + +CREATE TABLE SUBSCRIPTION ( + FK_PLAN_ID NUMBER, + FK_CONTACT_ID NUMBER, + MODIFIED_BY NUMBER, + CREATED_DT TIMESTAMP DEFAULT SYSDATE, + MODIFIED_DT TIMESTAMP DEFAULT SYSDATE, + CONSTRAINT PK_SUBSCRIPTION PRIMARY KEY (FK_PLAN_ID, FK_CONTACT_ID), + FOREIGN KEY(FK_CONTACT_ID) REFERENCES CONTACT(CONTACT_ID), + FOREIGN KEY(FK_PLAN_ID) REFERENCES PLAN(PLAN_ID) +); + +/* Once invoice is paid, external system inserts invoice uid. Insert/Update.*/ +CREATE TABLE INVOICE ( + INVOICE_ID RAW(16) DEFAULT SYS_GUID() NOT NULL PRIMARY KEY, + FK_PLAN_ID NUMBER, + FK_CONTACT_ID NUMBER, + InvoiceDate DATE, + AmountPaid DECIMAL(10, 2) DEFAULT 0, + FOREIGN KEY(FK_CONTACT_ID) REFERENCES CONTACT(CONTACT_ID), + FOREIGN KEY(FK_PLAN_ID) REFERENCES PLAN(PLAN_ID) +); + +CREATE TABLE AUTHORIZATION ( + AUTHORIZATION_ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + FK_CONTACT_ID NUMBER, + AUTHORIZATION_STATUS VARCHAR2(16) NOT NULL, + AUTHORIZATION_DATE TIMESTAMP DEFAULT SYSDATE, + EXPIRATION_DATE TIMESTAMP DEFAULT SYSDATE, + FK_DOCUMENT_ID NUMBER, + MODIFIED_BY NUMBER, + CREATED_DT TIMESTAMP DEFAULT SYSDATE, + MODIFIED_DT TIMESTAMP DEFAULT SYSDATE, + FOREIGN KEY(FK_CONTACT_ID) REFERENCES CONTACT(CONTACT_ID), + FOREIGN KEY(FK_DOCUMENT_ID) REFERENCES DOCUMENT(DOCUMENT_ID), + CONSTRAINT check_authorization_status CHECK (AUTHORIZATION_STATUS IN ('pending', 'approved', 'rejected', 'expired')) +); + +CREATE TABLE INVENTORY ( + INVENTORY_ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + FK_CONTACT_ID NUMBER NOT NULL, + AUTHORIZATION_ID NUMBER, + SKU VARCHAR2(100) NOT NULL, + PRODUCT_DESCRIPTION VARCHAR2(100) NOT NULL, + UNIT_COST DECIMAL(10,2) NOT NULL, + LEAD_TIME_DAYS INTEGER NOT NULL, + PRODUCT_NAME VARCHAR2(100) NOT NULL, + UNIT_OF_MEASURE VARCHAR2(50) NOT NULL, + BASE_PRICE DECIMAL(10,2) NOT NULL, + QUANTITY_AVAILABLE INTEGER DEFAULT 0 NOT NULL, + CREATED_AT TIMESTAMP DEFAULT SYSDATE, + UPDATED_AT TIMESTAMP DEFAULT SYSDATE, + FK_DOCUMENT_ID NUMBER, + FOREIGN KEY(FK_CONTACT_ID) REFERENCES CONTACT(CONTACT_ID), + FOREIGN KEY(FK_DOCUMENT_ID) REFERENCES DOCUMENT(DOCUMENT_ID), + FOREIGN KEY(AUTHORIZATION_ID) REFERENCES AUTHORIZATION(AUTHORIZATION_ID), + CONSTRAINT SUPPLIER_UNIQUE_SKU UNIQUE(FK_CONTACT_ID, SKU) +); + +CREATE TABLE EXHIBIT ( + EXHIBIT_ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + FK_INVENTORY_ID NUMBER NOT NULL, + FK_PLAN_ID NUMBER, + FOREIGN KEY(FK_PLAN_ID) REFERENCES PLAN(PLAN_ID), + FOREIGN KEY(FK_INVENTORY_ID) REFERENCES INVENTORY(INVENTORY_ID) +); + +CREATE TABLE ORDER_ITEMS ( -- 'product line items customers placed in their carts.' + ORDER_ITEM_ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + FK_PROFILE_ID NUMBER NOT NULL, + TRANSACTION_ID VARCHAR2(32) NULL, + CREATED_AT TIMESTAMP NOT NULL, + QUANTITY NUMBER DEFAULT(1) NOT NULL, + UNIT_PRICE DECIMAL(10,2) NOT NULL, + LINE_TOTAL DECIMAL(10,2) NOT NULL, + FK_INVENTORY_ID NUMBER NOT NULL, + FOREIGN KEY(FK_PROFILE_ID) REFERENCES PROFILE(PROFILE_ID), + FOREIGN KEY(FK_INVENTORY_ID) REFERENCES INVENTORY(INVENTORY_ID) +); + +CREATE TABLE TASK_HISTORY( + TASK_ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + ASSIGNED_TO_PROFILE_ID NUMBER NOT NULL, + CREATED_BY_PROFILE_ID NUMBER NOT NULL, + RELATED_ENTITY_TYPE VARCHAR2(32), -- 'order', 'supplier', etc. + RELATED_ENTITY_ID NUMBER, + TASK_TYPE VARCHAR2(32) NOT NULL, + TASK_TITLE VARCHAR2(64) NOT NULL, + DESCRIPTION VARCHAR2(128), + FK_DOCUMENT_ID NUMBER, + STATUS VARCHAR2(16) DEFAULT 'pending', + DUE_DATE TIMESTAMP, + COMPLETED_AT TIMESTAMP, + CREATED_AT TIMESTAMP DEFAULT SYSDATE, + UPDATED_AT TIMESTAMP DEFAULT SYSDATE, + FOREIGN KEY(FK_DOCUMENT_ID) REFERENCES DOCUMENT(DOCUMENT_ID), + CONSTRAINT chk_status CHECK (STATUS IN ('pending', 'in_progress', 'completed', 'cancelled')) +); + +/* VIEW of available exhibit inventory */ +CREATE OR REPLACE VIEW VIEW_AVAILABLE_INVENTORY AS + SELECT + INVENTORY_ID,FK_CONTACT_ID,AUTHORIZATION_ID,SKU,PRODUCT_DESCRIPTION,UNIT_COST,LEAD_TIME_DAYS, + PRODUCT_NAME,UNIT_OF_MEASURE,BASE_PRICE,QUANTITY_AVAILABLE,CREATED_AT,UPDATED_AT,FK_DOCUMENT_ID + FROM + INVENTORY WHERE QUANTITY_AVAILABLE > 0 +INTERSECT + SELECT + FK_INVENTORY_ID, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL + FROM + EXHIBIT; + +CREATE OR REPLACE VIEW VIEW_SYSTEMROLE AS + SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, r.ROLENAME, p.ACTIVE FROM + USERROLE u + JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID + JOIN ROLE r ON r.ROLE_ID = u.FK_ROLE_ID AND r.ROLE_ID = 100; + +CREATE OR REPLACE VIEW VIEW_STAFF AS + SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, r.ROLENAME, p.ACTIVE, c.FIRST_NAME, c.LAST_NAME, s.POSITION FROM + USERROLE u + JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID + JOIN CONTACT c ON c.CONTACT_ID = p.FK_CONTACT_ID + JOIN ROLE r ON r.ROLE_ID = u.FK_ROLE_ID AND r.ROLE_ID = 300 + JOIN STAFF s on s.FK_PROFILE_ID = p.PROFILE_ID; + +CREATE OR REPLACE VIEW VIEW_SUPPLIER AS + SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, r.ROLENAME, p.ACTIVE, c.FIRST_NAME, c.LAST_NAME FROM + USERROLE u + JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID + JOIN CONTACT c ON c.CONTACT_ID = p.FK_CONTACT_ID + JOIN ROLE r ON r.ROLE_ID = u.FK_ROLE_ID AND r.ROLE_ID = 200; + +CREATE OR REPLACE VIEW VIEW_CUSTOMER AS + SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, r.ROLENAME, p.ACTIVE, c.FIRST_NAME, c.LAST_NAME FROM + USERROLE u + JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID + JOIN CONTACT c ON c.CONTACT_ID = p.FK_CONTACT_ID + JOIN ROLE r ON r.ROLE_ID = u.FK_ROLE_ID AND r.ROLE_ID = 400; + +-- Trigger customer ordered items reservation +CREATE OR REPLACE TRIGGER ORDER_ITEMS_reserved + AFTER INSERT ON ORDER_ITEMS FOR EACH ROW + BEGIN + UPDATE INVENTORY SET QUANTITY_AVAILABLE = QUANTITY_AVAILABLE - :NEW.QUANTITY WHERE INVENTORY_ID= :NEW.FK_INVENTORY_ID; + DBMS_OUTPUT.put_line(' ORDER transaction. ' ); + END; +/ + +-- Trigger Paid Invoice, generates subscription +CREATE OR REPLACE TRIGGER INVOICE_paid_subscription + AFTER INSERT OR UPDATE ON INVOICE FOR EACH ROW + BEGIN + DBMS_OUTPUT.put_line(' SUBSCRIPTION transaction. ' ); + INSERT INTO SUBSCRIPTION (FK_PLAN_ID, FK_CONTACT_ID) VALUES (:NEW.FK_PLAN_ID, :NEW.FK_CONTACT_ID); + EXCEPTION + WHEN DUP_VAL_ON_INDEX THEN + DBMS_OUTPUT.put_line('Subscription exists for plan and contact. No new subscription created.'); + UPDATE SUBSCRIPTION SET FK_PLAN_ID = :NEW.FK_PLAN_ID, FK_CONTACT_ID = :NEW.FK_CONTACT_ID, MODIFIED_BY = 1, MODIFIED_DT = SYSDATE + WHERE FK_PLAN_ID = :NEW.FK_PLAN_ID AND FK_CONTACT_ID = :NEW.FK_CONTACT_ID; + WHEN OTHERS THEN + DBMS_OUTPUT.put_line('Error in INVOICE_paid_subscription creating/updating subscription: ' || SQLERRM); + END; +/ + +CREATE OR REPLACE PROCEDURE sp_auth_supplier( + p_status IN VARCHAR, + p_supplier IN NUMBER, + p_document_url IN VARCHAR +) IS + l_id NUMBER; +BEGIN + BEGIN + INSERT INTO DOCUMENT(DOCUMENT_ID, DOCUMENT_URL) VALUES (ISEQ_DOCUMENT.nextval, p_document_url) + RETURNING DOCUMENT_ID INTO l_id; -- Captures the generated ID + END; + BEGIN + INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, MODIFIED_BY, FK_DOCUMENT_ID) VALUES(p_status, p_supplier, 1, l_id); + DBMS_OUTPUT.put_line('Reviewed Document ' || p_status ); + EXCEPTION + WHEN OTHERS + THEN + DBMS_OUTPUT.put_line (SQLERRM); + raise_application_error (-20500, 'failed while setting auth_supplier_status. '); + END; +END; + +/ + +INSERT INTO ROLE (ROLE_ID, ROLENAME) VALUES (100, 'SYSTEM'); +INSERT INTO ROLE (ROLE_ID, ROLENAME) VALUES (200, 'SUPPLIER'); +INSERT INTO ROLE (ROLE_ID, ROLENAME) VALUES (300, 'STAFF'); +INSERT INTO ROLE (ROLE_ID, ROLENAME) VALUES (400, 'CUSTOMER'); + +-- SYSTEM ROLE +INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('ART', 'SYSTEM', '000-1234', 'arts@art.com', 1); +-- STAFF ROLE +INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Alice', 'Johnson', '650-555-9012', 'alice.johnson@art.com', 1); +INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ( 'Karen', 'Park', '206-555-0110', 'karen.park@art.com', 1); +INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ( 'Jeese', 'Taylor', '713-555-0106', 'grace.taylor@art.com', 1); +INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ( 'James', 'Lee', '206-555-0109', 'james.lee@art.com', 1); +-- SUPPLIER ROLE +INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Stephen', 'Alec', '424-546-9312', 'salec@eizel.com', 1); +INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Henry', 'Martinez', '602-555-0107', 'henry@artsupply.com', 1); +-- CUSTOMER ROLE +INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Carol', 'White', '212-555-0102', 'carol.white@mail.com', 1); +INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Bob', 'Smith', '212-555-0101', 'bob.smith@mail.com', 1); +INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('David', 'Brown', '312-555-0103', 'david.brown@mail.com', 1); +INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Emma', 'Davis', '312-555-0104', 'emma.davis@mail.com', 1); +INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Frank', 'Wilson', '713-555-0105', 'frank.wilson@mail.com', 1); + +INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('10001', 'New York', 'NY'); +INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('90210', 'Beverly Hills', 'CA'); +INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('94027', 'Atherton', 'CA'); +INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('90211', 'Los Angeles', 'CA'); +INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('60601', 'Chicago', 'IL'); +INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('77001', 'Houston', 'TX'); +INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('85001', 'Phoenix', 'AZ'); +INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('98101', 'Seattle', 'WA'); +INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('02101', 'Boston', 'MA'); +INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('33101', 'Miami', 'FL'); + +INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (1, '789 Oak St, suite 10', '94027'); +INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (2, '789 Oak St, suite 15', '94027'); +INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (3, '789 Oak St, suite 1', '94027'); +INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (4, '789 Oak St, suite 5', '94027'); +INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (5, '789 Oak St, suite 15', '94027'); +INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (6, '890 Venue Rd', '90210'); +INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (7, '200 Sunset Blvd', '90210'); +INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (8, '100 Broadway', '10001'); +INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (9, '300 Michigan Ave', '60601'); +INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (10, '400 Main St', '77001'); +INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP ) VALUES (11, '500 Central Ave', '85001'); +INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP ) VALUES (12, '600 Pike St', '98101'); + +-- SYSTEMPROFILE +INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (1, TRUE, 1); +-- STAFF PROFILE +INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (2, TRUE, 2); +-- SUPPLIER +INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (3, TRUE, 3); + +INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (4, 4, TRUE, 1); +INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (5, 5, TRUE, 1); +INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (6, 6, TRUE, 1); +INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (7, 7, TRUE, 1); +INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (8, 8, FALSE, 1); -- inactive +INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (9, 9, TRUE, 1); +INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (10, 10, TRUE, 1); +INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (11, 11, TRUE, 1); +INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (12, 12, TRUE, 1); + + +INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID, PASSWORDHASH) VALUES (1, 100, NULL); +INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (2, 300); +INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (3, 300); +INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (4, 300); +INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (5, 300); +INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (6, 200); +INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (7, 200); +INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (8, 400); -- inactive customer +INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (9, 400); +INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (10, 400); +INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (11, 400); +INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (12, 400); + +INSERT INTO STAFF (FK_PROFILE_ID, POSITION) VALUES (2, 'Director'); +INSERT INTO STAFF (FK_PROFILE_ID, POSITION) VALUES (3, 'Registrar'); +INSERT INTO STAFF (FK_PROFILE_ID, POSITION) VALUES (4, 'Curator'); +INSERT INTO STAFF (FK_PROFILE_ID, POSITION) VALUES (5, 'Art Handler'); + +INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (2, 'https://art.com/docs/consignment-stephen-crimson-horizon.pdf'); +INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (3, 'https://art.com/docs/consignment-stephen-misty-valley.pdf'); +INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (4, 'https://art.com/docs/consignment-stephen-twisted-form.pdf'); +INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (5, 'https://art.com/docs/consignment-stephen-blue-symmetry.pdf'); +INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (6, 'https://art.com/docs/consignment-henry-urban-solitude.pdf'); +INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (7, 'https://art.com/docs/consignment-henry-earth-vessel.pdf'); +INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (8, 'https://art.com/docs/consignment-henry-quiet-reflection.pdf'); + +-- Stephen — approved +INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) +VALUES ('approved', 6, 2, 1, SYSDATE, SYSDATE + 365); +-- Stephen — approved +INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) +VALUES ('approved', 6, 3, 1, SYSDATE, SYSDATE + 365); +-- Stephen — pending ('pending' status path) +INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) +VALUES ('pending', 6, 4, 1, SYSDATE, SYSDATE + 365); +-- Stephen — rejected ('rejected' status path) +INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) +VALUES ('rejected', 6, 5, 1, SYSDATE, SYSDATE + 30); +-- Henry — approved +INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) +VALUES ('approved', 7, 6, 1, SYSDATE, SYSDATE + 365); +-- Henry — approved +INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) +VALUES ('approved', 7, 7, 1, SYSDATE, SYSDATE + 365); +-- Henry — approved +INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) +VALUES ('approved', 7, 8, 1, SYSDATE, SYSDATE + 365); +-- Henry — pending +INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) +VALUES ('pending', 7, 7, 1, SYSDATE, SYSDATE + 180); +-- Henry — expired (EXPIRATION_DATE in the past) +INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) +VALUES ('expired', 7, 8, 1, SYSDATE - 365, SYSDATE - 30); + +-- PLAN Documents for exhibition +INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (9, 'https://art.com/docs/plan-spring-gala-2025.pdf'); +INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (10, 'https://art.com/docs/plan-summer-exhibit-2025.pdf'); +INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (11, 'https://art.com/docs/plan-fall-exhibition-2025.pdf'); + +-- PLANS +INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Spring Gala Preview', 9, 4, 75.00, 1); -- PLAN_ID 1 +INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Spring Gala Standard', 9, 8, 120.00, 1); -- PLAN_ID 2 +INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Spring Gala VIP', 9, 12, 250.00, 1); -- PLAN_ID 3 +INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Summer Exhibit Basic', 10, 4, 50.00, 1); -- PLAN_ID 4 +INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Summer Exhibit Plus', 10, 8, 100.00, 1); -- PLAN_ID 5 +INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Summer Exhibit Premium', 10, 16, 200.00, 1); -- PLAN_ID 6 +INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Fall Exhibition Access', 11, 4, 60.00, 1); -- PLAN_ID 7 +INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Fall Exhibition Full Day',11, 8, 110.00, 1); -- PLAN_ID 8 +INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Fall Exhibition Weekend', 11, 24, 180.00, 1); -- PLAN_ID 9 +INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Annual Patron Pass', 11, 200, 500.00, 1); -- PLAN_ID 10 + +-- IV 1 — Crimson Horizon +INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) +VALUES (6, 1, 'ART-S-001', + 'Oil on canvas, abstract expressionism, 24x36', 800.00, 7, + 'Crimson Horizon', 'piece', 1200.00, 5, 2); + +-- IV 2 — Misty Valley +INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) +VALUES (6, 2, 'ART-S-002', + 'Watercolor on paper, landscape, 18x24', 450.00, 5, + 'Misty Valley', 'piece', 700.00, 5, 3); + +-- IV 3 — Twisted Form +INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) +VALUES (6, 3, 'ART-S-003', + 'Bronze sculpture, abstract, 12 in height', 1500.00, 14, + 'Twisted Form', 'piece', 2200.00, 5, 4); + +-- IV 4 — Blue Symmetry +INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) +VALUES (7, 1, 'ART-S-004', + 'Acrylic on canvas, geometric, 30x30', 600.00, 7, + 'Blue Symmetry', 'piece', 950.00, 5, 2); + +-- IV 5 — Urban Collage +INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) +VALUES (7, 2, 'ART-S-005', + 'Mixed media on board, 20x20', 350.00, 5, + 'Urban Collage', 'piece', 550.00, 6, 3); + +-- IV 6 — Urban Solitude +INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) +VALUES (6, 6, 'ART-H-001', + 'Photography print, archival, limited ed 1/10', 900.00, 3, + 'Urban Solitude', 'piece', 1500.00, 10, 6); + +-- IV 7 — Earth Vessel +INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) +VALUES (7, 7, 'ART-H-002', + 'Ceramic vessel, hand-thrown and glazed', 250.00, 10, + 'Earth Vessel', 'piece', 420.00, 8, 7); + +-- IV 8 — Quiet Reflection +INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) +VALUES (7, 8, 'ART-H-003', + 'Pastel drawing, portrait, 16x20', 300.00, 7, + 'Quiet Reflection','piece', 500.00, 4, 8); + +-- IV 9 — Neon Dreams +INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) +VALUES (6, 6, 'ART-H-004', + 'Digital print on aluminum, 24x36', 700.00, 5, + 'Neon Dreams', 'piece', 1100.00, 6, 6); + +-- IV 10 — Woven Stories +INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) +VALUES (6, 7, 'ART-H-005', + 'Textile wall hanging, woven, 36x48', 550.00, 14, + 'Woven Stories', 'piece', 850.00, 5, 7); + +INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (1, 1); -- Crimson Horizon → Spring Preview +INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (2, 2); -- Misty Valley → Spring Standard +INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (3, 3); -- Twisted Form → Spring VIP +INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (4, 4); -- Blue Symmetry → Summer Basic +INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (5, 5); -- Urban Collage → Summer Plus +INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (6, 6); -- Urban Solitude → Summer Premium +INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (7, 7); -- Earth Vessel → Fall Access +INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (8, 8); -- Quiet Reflection → Fall Full Day +INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (9, 9); -- Neon Dreams → Fall Weekend +INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (10, 10); -- Woven Stories → Annual Pass + + +INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (9, 1, DATE'2025-01-01', 75.00); -- Bob — Spring Preview +INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (10, 2, DATE'2025-01-02', 120.00); -- Carol — Spring Standard +INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (11, 3, DATE'2025-01-03', 250.00); -- David — Spring VIP +INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (12, 4, DATE'2025-01-04', 50.00); -- Emma — Summer Basic +INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (9, 5, DATE'2025-01-05', 100.00); -- Bob — Summer Plus +INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (10, 6, DATE'2025-01-06', 150.00); -- Carol — Summer Premium +INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (11, 7, DATE'2025-01-07', 60.00); -- David — Fall Access +INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (12, 8, DATE'2025-01-08', 110.00); -- Emma — Fall Full Day +INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (9, 9, DATE'2025-01-09', 180.00); -- Bob — Fall Weekend +INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (10, 10, DATE'2025-01-10', 500.00); -- Carol — Annual Pass + +/ diff --git a/schema/Price_Sherwin_DDL_output.txt b/schema/Price_Sherwin_DDL_output.txt new file mode 100755 index 0000000..d7d85b5 --- /dev/null +++ b/schema/Price_Sherwin_DDL_output.txt @@ -0,0 +1,1087 @@ +SQL> SET SERVEROUTPUT ON; +SQL> +SQL> DECLARE + 2 l_tab DBMS_UTILITY.uncl_array; + 3 l_tablen number; + 4 BEGIN + 5 dbms_utility.comma_to_table('CONTACT,PROFILE,ROLE,USERROLE,STAFF,ZIP,ADDRESS,DOCUMENT,PLAN,EXHIBIT,SUBSCRIPTION,AUTHORIZATION,INVENTORY,ORDER_ITEMS,INVOICE,TASK_HISTORY' + 6 , l_tablen, l_tab); + 7 for i in 1..l_tablen + 8 LOOP + 9 BEGIN + 10 EXECUTE IMMEDIATE 'DROP TABLE ' || l_tab(i) || ' CASCADE CONSTRAINTS'; + 11 DBMS_OUTPUT.put_line('DROPPED ' || l_tab(i) ); + 12 EXCEPTION + 13 WHEN OTHERS THEN NULL; + 14 END; + 15 END LOOP; + 16 + 17 DBMS_UTILITY.comma_to_table('ISEQ_CONTACT,ISEQ_ROLE,ISEQ_PROFILE,ISEQ_DOCUMENT', l_tablen, l_tab); + 18 for i in 1..l_tablen + 19 LOOP + 20 BEGIN + 21 EXECUTE IMMEDIATE 'DROP SEQUENCE '|| l_tab(i); + 22 DBMS_OUTPUT.put_line('DROPPED ' || l_tab(i) ); + 23 EXCEPTION + 24 WHEN OTHERS THEN NULL; + 25 END; + 26 END LOOP; + 27 + 28 COMMIT; + 29 END; + 30 / +DROPPED CONTACT +DROPPED PROFILE +DROPPED ROLE +DROPPED USERROLE +DROPPED STAFF +DROPPED ZIP +DROPPED ADDRESS +DROPPED DOCUMENT +DROPPED PLAN +DROPPED EXHIBIT +DROPPED SUBSCRIPTION +DROPPED AUTHORIZATION +DROPPED INVENTORY +DROPPED ORDER_ITEMS +DROPPED INVOICE +DROPPED TASK_HISTORY +DROPPED ISEQ_CONTACT +DROPPED ISEQ_ROLE +DROPPED ISEQ_PROFILE +DROPPED ISEQ_DOCUMENT + + +PL/SQL procedure successfully completed. + +SQL> +SQL> CREATE SEQUENCE ISEQ_CONTACT START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; + +Sequence ISEQ_CONTACT created. + +SQL> +SQL> CREATE TABLE CONTACT ( + 2 CONTACT_ID NUMBER DEFAULT ISEQ_CONTACT.nextval NOT NULL, + 3 FIRST_NAME VARCHAR2(16) NOT NULL, + 4 LAST_NAME VARCHAR2(16) NOT NULL, + 5 PHONE_NO VARCHAR2(12), + 6 EMAIL VARCHAR2(64) NOT NULL, + 7 MODIFIED_BY NUMBER, + 8 CREATED_DT TIMESTAMP DEFAULT SYSDATE, + 9 MODIFIED_DT TIMESTAMP DEFAULT SYSDATE, + 10 CONSTRAINT PK_CONTACT_ID PRIMARY KEY (CONTACT_ID), + 11 FOREIGN KEY (MODIFIED_BY) REFERENCES CONTACT(CONTACT_ID) + 12 ); + +Table CONTACT created. + +SQL> +SQL> CREATE TABLE ZIP ( + 2 ZIP VARCHAR2(5), + 3 CITY VARCHAR2(16), + 4 STATE VARCHAR2(2), + 5 CONSTRAINT PK_ZIP PRIMARY KEY (ZIP), + 6 CONSTRAINT ZIP_CHECK CHECK ( REGEXP_LIKE(ZIP, '\d{5}') ) + 7 ); + +Table ZIP created. + +SQL> +SQL> CREATE TABLE ADDRESS ( + 2 ZIP VARCHAR2(5) NOT NULL, + 3 FK_CONTACT_ID NUMBER NOT NULL, + 4 STREET VARCHAR2(32) NOT NULL, + 5 CONSTRAINT PK_ADDRESS PRIMARY KEY (ZIP, FK_CONTACT_ID), + 6 FOREIGN KEY (FK_CONTACT_ID) REFERENCES CONTACT(CONTACT_ID) ON DELETE CASCADE, + 7 FOREIGN KEY (ZIP) REFERENCES ZIP(ZIP) + 8 ); + +Table ADDRESS created. + +SQL> +SQL> CREATE SEQUENCE "ISEQ_ROLE" START WITH 100 INCREMENT BY 100 NOCACHE NOCYCLE; + +Sequence "ISEQ_ROLE" created. + +SQL> +SQL> CREATE TABLE ROLE ( + 2 ROLE_ID NUMBER DEFAULT ISEQ_ROLE.nextval NOT NULL, + 3 ROLENAME VARCHAR2(16), + 4 CONSTRAINT PK_ROLE_ID PRIMARY KEY (ROLE_ID), + 5 CONSTRAINT check_role CHECK (ROLENAME IN ('SYSTEM', 'CONTACT', 'CUSTOMER', 'STAFF', 'SUPPLIER')) + 6 ); + +Table ROLE created. + +SQL> +SQL> CREATE SEQUENCE "ISEQ_PROFILE" START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; + +Sequence "ISEQ_PROFILE" created. + +SQL> +SQL> CREATE TABLE PROFILE ( + 2 PROFILE_ID NUMBER DEFAULT ISEQ_PROFILE.nextval NOT NULL, + 3 FK_CONTACT_ID NUMBER NOT NULL, + 4 ACTIVE BOOLEAN DEFAULT FALSE, + 5 MODIFIED_BY NUMBER NOT NULL, + 6 CREATED_DT TIMESTAMP DEFAULT SYSDATE, + 7 MODIFIED_DT TIMESTAMP DEFAULT SYSDATE, + 8 CONSTRAINT PK_PROFILE_ID PRIMARY KEY(PROFILE_ID), + 9 FOREIGN KEY (FK_CONTACT_ID) REFERENCES CONTACT(CONTACT_ID) ON DELETE CASCADE, + 10 FOREIGN KEY(MODIFIED_BY) REFERENCES PROFILE(PROFILE_ID) + 11 ); + +Table PROFILE created. + +SQL> +SQL> CREATE TABLE USERROLE ( + 2 FK_PROFILE_ID NUMBER NOT NULL, + 3 FK_ROLE_ID NUMBER NOT NULL, + 4 PASSWORDHASH RAW(256) DEFAULT NULL, + 5 CONSTRAINT PK_USERROLE PRIMARY KEY (FK_ROLE_ID,FK_PROFILE_ID), + 6 FOREIGN KEY(FK_PROFILE_ID) REFERENCES PROFILE(PROFILE_ID) ON DELETE CASCADE, + 7 FOREIGN KEY(FK_ROLE_ID) REFERENCES ROLE(ROLE_ID) ON DELETE CASCADE + 8 ); + +Table USERROLE created. + +SQL> +SQL> CREATE TABLE STAFF( + 2 FK_PROFILE_ID NUMBER NOT NULL, + 3 POSITION VARCHAR2(14) NOT NULL, + 4 CONSTRAINT check_position CHECK (POSITION IN ('Director', 'Curator', + 5 'Art Handler', 'Registrar', 'Associate')), + 6 CONSTRAINT PK_STAFF PRIMARY KEY (FK_PROFILE_ID), + 7 FOREIGN KEY(FK_PROFILE_ID) REFERENCES PROFILE(PROFILE_ID) + 8 ); + +Table STAFF created. + +SQL> +SQL> CREATE SEQUENCE ISEQ_DOCUMENT START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; + +Sequence ISEQ_DOCUMENT created. + +SQL> CREATE TABLE DOCUMENT ( + 2 DOCUMENT_ID NUMBER DEFAULT ISEQ_DOCUMENT.nextval NOT NULL, + 3 DOCUMENT_URL VARCHAR2(254) NOT NULL, + 4 CONSTRAINT PK_DOCUMENT PRIMARY KEY (DOCUMENT_ID) + 5 ); + +Table DOCUMENT created. + +SQL> +SQL> CREATE TABLE PLAN ( + 2 PLAN_ID NUMBER GENERATED ALWAYS AS IDENTITY, + 3 DESCRIPTION VARCHAR2(32), + 4 FK_DOCUMENT_ID NUMBER NOT NULL, + 5 Duration NUMBER, --in hours + 6 price NUMBER, + 7 MODIFIED_BY NUMBER, + 8 CREATED_DT TIMESTAMP DEFAULT SYSDATE, + 9 MODIFIED_DT TIMESTAMP DEFAULT SYSDATE, + 10 CONSTRAINT PK_PLAN PRIMARY KEY(PLAN_ID), + 11 FOREIGN KEY(FK_DOCUMENT_ID) REFERENCES DOCUMENT(DOCUMENT_ID) + 12 ); + +Table PLAN created. + +SQL> +SQL> CREATE TABLE SUBSCRIPTION ( + 2 FK_PLAN_ID NUMBER, + 3 FK_CONTACT_ID NUMBER, + 4 MODIFIED_BY NUMBER, + 5 CREATED_DT TIMESTAMP DEFAULT SYSDATE, + 6 MODIFIED_DT TIMESTAMP DEFAULT SYSDATE, + 7 CONSTRAINT PK_SUBSCRIPTION PRIMARY KEY (FK_PLAN_ID, FK_CONTACT_ID), + 8 FOREIGN KEY(FK_CONTACT_ID) REFERENCES CONTACT(CONTACT_ID), + 9 FOREIGN KEY(FK_PLAN_ID) REFERENCES PLAN(PLAN_ID) + 10 ); + +Table SUBSCRIPTION created. + +SQL> +SQL> /* Once invoice is paid, external system inserts invoice uid. Insert/Update.*/ +SQL> CREATE TABLE INVOICE ( + 2 INVOICE_ID RAW(16) DEFAULT SYS_GUID() NOT NULL PRIMARY KEY, + 3 FK_PLAN_ID NUMBER, + 4 FK_CONTACT_ID NUMBER, + 5 InvoiceDate DATE, + 6 AmountPaid DECIMAL(10, 2) DEFAULT 0, + 7 FOREIGN KEY(FK_CONTACT_ID) REFERENCES CONTACT(CONTACT_ID), + 8 FOREIGN KEY(FK_PLAN_ID) REFERENCES PLAN(PLAN_ID) + 9 ); + +Table INVOICE created. + +SQL> +SQL> CREATE TABLE AUTHORIZATION ( + 2 AUTHORIZATION_ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + 3 FK_CONTACT_ID NUMBER, + 4 AUTHORIZATION_STATUS VARCHAR2(16) NOT NULL, + 5 AUTHORIZATION_DATE TIMESTAMP DEFAULT SYSDATE, + 6 EXPIRATION_DATE TIMESTAMP DEFAULT SYSDATE, + 7 FK_DOCUMENT_ID NUMBER, + 8 MODIFIED_BY NUMBER, + 9 CREATED_DT TIMESTAMP DEFAULT SYSDATE, + 10 MODIFIED_DT TIMESTAMP DEFAULT SYSDATE, + 11 FOREIGN KEY(FK_CONTACT_ID) REFERENCES CONTACT(CONTACT_ID), + 12 FOREIGN KEY(FK_DOCUMENT_ID) REFERENCES DOCUMENT(DOCUMENT_ID), + 13 CONSTRAINT check_authorization_status CHECK (AUTHORIZATION_STATUS IN ('pending', 'approved', 'rejected', 'expired')) + 14 ); + +Table AUTHORIZATION created. + +SQL> +SQL> CREATE TABLE INVENTORY ( + 2 INVENTORY_ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + 3 FK_CONTACT_ID NUMBER NOT NULL, + 4 AUTHORIZATION_ID NUMBER, + 5 SKU VARCHAR2(100) NOT NULL, + 6 PRODUCT_DESCRIPTION VARCHAR2(100) NOT NULL, + 7 UNIT_COST DECIMAL(10,2) NOT NULL, + 8 LEAD_TIME_DAYS INTEGER NOT NULL, + 9 PRODUCT_NAME VARCHAR2(100) NOT NULL, + 10 UNIT_OF_MEASURE VARCHAR2(50) NOT NULL, + 11 BASE_PRICE DECIMAL(10,2) NOT NULL, + 12 QUANTITY_AVAILABLE INTEGER DEFAULT 0 NOT NULL, + 13 CREATED_AT TIMESTAMP DEFAULT SYSDATE, + 14 UPDATED_AT TIMESTAMP DEFAULT SYSDATE, + 15 FK_DOCUMENT_ID NUMBER, + 16 FOREIGN KEY(FK_CONTACT_ID) REFERENCES CONTACT(CONTACT_ID), + 17 FOREIGN KEY(FK_DOCUMENT_ID) REFERENCES DOCUMENT(DOCUMENT_ID), + 18 FOREIGN KEY(AUTHORIZATION_ID) REFERENCES AUTHORIZATION(AUTHORIZATION_ID), + 19 CONSTRAINT SUPPLIER_UNIQUE_SKU UNIQUE(FK_CONTACT_ID, SKU) + 20 ); + +Table INVENTORY created. + +SQL> +SQL> CREATE TABLE EXHIBIT ( + 2 EXHIBIT_ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + 3 FK_INVENTORY_ID NUMBER NOT NULL, + 4 FK_PLAN_ID NUMBER, + 5 FOREIGN KEY(FK_PLAN_ID) REFERENCES PLAN(PLAN_ID), + 6 FOREIGN KEY(FK_INVENTORY_ID) REFERENCES INVENTORY(INVENTORY_ID) + 7 ); + +Table EXHIBIT created. + +SQL> +SQL> CREATE TABLE ORDER_ITEMS ( -- 'product line items customers placed in their carts.' + 2 ORDER_ITEM_ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + 3 FK_PROFILE_ID NUMBER NOT NULL, + 4 TRANSACTION_ID VARCHAR2(32) NULL, + 5 CREATED_AT TIMESTAMP NOT NULL, + 6 QUANTITY NUMBER DEFAULT(1) NOT NULL, + 7 UNIT_PRICE DECIMAL(10,2) NOT NULL, + 8 LINE_TOTAL DECIMAL(10,2) NOT NULL, + 9 FK_INVENTORY_ID NUMBER NOT NULL, + 10 FOREIGN KEY(FK_PROFILE_ID) REFERENCES PROFILE(PROFILE_ID), + 11 FOREIGN KEY(FK_INVENTORY_ID) REFERENCES INVENTORY(INVENTORY_ID) + 12 ); + +Table ORDER_ITEMS created. + +SQL> +SQL> CREATE TABLE TASK_HISTORY( + 2 TASK_ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + 3 ASSIGNED_TO_PROFILE_ID NUMBER NOT NULL, + 4 CREATED_BY_PROFILE_ID NUMBER NOT NULL, + 5 RELATED_ENTITY_TYPE VARCHAR2(32), -- 'order', 'supplier', etc. + 6 RELATED_ENTITY_ID NUMBER, + 7 TASK_TYPE VARCHAR2(32) NOT NULL, + 8 TASK_TITLE VARCHAR2(64) NOT NULL, + 9 DESCRIPTION VARCHAR2(128), + 10 FK_DOCUMENT_ID NUMBER, + 11 STATUS VARCHAR2(16) DEFAULT 'pending', + 12 DUE_DATE TIMESTAMP, + 13 COMPLETED_AT TIMESTAMP, + 14 CREATED_AT TIMESTAMP DEFAULT SYSDATE, + 15 UPDATED_AT TIMESTAMP DEFAULT SYSDATE, + 16 FOREIGN KEY(FK_DOCUMENT_ID) REFERENCES DOCUMENT(DOCUMENT_ID), + 17 CONSTRAINT chk_status CHECK (STATUS IN ('pending', 'in_progress', 'completed', 'cancelled')) + 18 ); + +Table TASK_HISTORY created. + +SQL> +SQL> /* VIEW of available exhibit inventory */ +SQL> CREATE OR REPLACE VIEW VIEW_AVAILABLE_INVENTORY AS + 2 SELECT + 3 INVENTORY_ID,FK_CONTACT_ID,AUTHORIZATION_ID,SKU,PRODUCT_DESCRIPTION,UNIT_COST,LEAD_TIME_DAYS, + 4 PRODUCT_NAME,UNIT_OF_MEASURE,BASE_PRICE,QUANTITY_AVAILABLE,CREATED_AT,UPDATED_AT,FK_DOCUMENT_ID + 5 FROM + 6 INVENTORY WHERE QUANTITY_AVAILABLE > 0 + 7 INTERSECT + 8 SELECT + 9 FK_INVENTORY_ID, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL + 10 FROM + 11 EXHIBIT; + +View VIEW_AVAILABLE_INVENTORY created. + +SQL> +SQL> CREATE OR REPLACE VIEW VIEW_SYSTEMROLE AS + 2 SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, r.ROLENAME, p.ACTIVE FROM + 3 USERROLE u + 4 JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID + 5 JOIN ROLE r ON r.ROLE_ID = u.FK_ROLE_ID AND r.ROLE_ID = 100; + +View VIEW_SYSTEMROLE created. + +SQL> +SQL> CREATE OR REPLACE VIEW VIEW_STAFF AS + 2 SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, r.ROLENAME, p.ACTIVE, c.FIRST_NAME, c.LAST_NAME, s.POSITION FROM + 3 USERROLE u + 4 JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID + 5 JOIN CONTACT c ON c.CONTACT_ID = p.FK_CONTACT_ID + 6 JOIN ROLE r ON r.ROLE_ID = u.FK_ROLE_ID AND r.ROLE_ID = 300 + 7 JOIN STAFF s on s.FK_PROFILE_ID = p.PROFILE_ID; + +View VIEW_STAFF created. + +SQL> +SQL> CREATE OR REPLACE VIEW VIEW_SUPPLIER AS + 2 SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, r.ROLENAME, p.ACTIVE, c.FIRST_NAME, c.LAST_NAME FROM + 3 USERROLE u + 4 JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID + 5 JOIN CONTACT c ON c.CONTACT_ID = p.FK_CONTACT_ID + 6 JOIN ROLE r ON r.ROLE_ID = u.FK_ROLE_ID AND r.ROLE_ID = 200; + +View VIEW_SUPPLIER created. + +SQL> +SQL> CREATE OR REPLACE VIEW VIEW_CUSTOMER AS + 2 SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, r.ROLENAME, p.ACTIVE, c.FIRST_NAME, c.LAST_NAME FROM + 3 USERROLE u + 4 JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID + 5 JOIN CONTACT c ON c.CONTACT_ID = p.FK_CONTACT_ID + 6 JOIN ROLE r ON r.ROLE_ID = u.FK_ROLE_ID AND r.ROLE_ID = 400; + +View VIEW_CUSTOMER created. + +SQL> +SQL> -- Trigger customer ordered items reservation +SQL> CREATE OR REPLACE TRIGGER ORDER_ITEMS_reserved + 2 AFTER INSERT ON ORDER_ITEMS FOR EACH ROW + 3 BEGIN + 4 UPDATE INVENTORY SET QUANTITY_AVAILABLE = QUANTITY_AVAILABLE - :NEW.QUANTITY WHERE INVENTORY_ID= :NEW.FK_INVENTORY_ID; + 5 DBMS_OUTPUT.put_line(' ORDER transaction. ' ); + 6 END; + 7 / + +Trigger ORDER_ITEMS_RESERVED compiled + +SQL> +SQL> -- Trigger Paid Invoice, generates subscription +SQL> CREATE OR REPLACE TRIGGER INVOICE_paid_subscription + 2 AFTER INSERT OR UPDATE ON INVOICE FOR EACH ROW + 3 BEGIN + 4 DBMS_OUTPUT.put_line(' SUBSCRIPTION transaction. ' ); + 5 INSERT INTO SUBSCRIPTION (FK_PLAN_ID, FK_CONTACT_ID) VALUES (:NEW.FK_PLAN_ID, :NEW.FK_CONTACT_ID); + 6 EXCEPTION + 7 WHEN DUP_VAL_ON_INDEX THEN + 8 DBMS_OUTPUT.put_line('Subscription exists for plan and contact. No new subscription created.'); + 9 UPDATE SUBSCRIPTION SET FK_PLAN_ID = :NEW.FK_PLAN_ID, FK_CONTACT_ID = :NEW.FK_CONTACT_ID, MODIFIED_BY = 1, MODIFIED_DT = SYSDATE + 10 WHERE FK_PLAN_ID = :NEW.FK_PLAN_ID AND FK_CONTACT_ID = :NEW.FK_CONTACT_ID; + 11 WHEN OTHERS THEN + 12 DBMS_OUTPUT.put_line('Error in INVOICE_paid_subscription creating/updating subscription: ' || SQLERRM); + 13 END; + 14 / + +Trigger INVOICE_PAID_SUBSCRIPTION compiled + +SQL> +SQL> CREATE OR REPLACE PROCEDURE sp_auth_supplier( + 2 p_status IN VARCHAR, + 3 p_supplier IN NUMBER, + 4 p_document_url IN VARCHAR + 5 ) IS + 6 l_id NUMBER; + 7 BEGIN + 8 BEGIN + 9 INSERT INTO DOCUMENT(DOCUMENT_ID, DOCUMENT_URL) VALUES (ISEQ_DOCUMENT.nextval, p_document_url) + 10 RETURNING DOCUMENT_ID INTO l_id; -- Captures the generated ID + 11 END; + 12 BEGIN + 13 INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, MODIFIED_BY, FK_DOCUMENT_ID) VALUES(p_status, p_supplier, 1, l_id); + 14 DBMS_OUTPUT.put_line('Reviewed Document ' || p_status ); + 15 EXCEPTION + 16 WHEN OTHERS + 17 THEN + 18 DBMS_OUTPUT.put_line (SQLERRM); + 19 raise_application_error (-20500, 'failed while setting auth_supplier_status. '); + 20 END; + 21 END; + 22 + 23 / + +Procedure SP_AUTH_SUPPLIER compiled + +SQL> +SQL> INSERT INTO ROLE (ROLE_ID, ROLENAME) VALUES (100, 'SYSTEM'); + +1 row inserted. + +SQL> INSERT INTO ROLE (ROLE_ID, ROLENAME) VALUES (200, 'SUPPLIER'); + +1 row inserted. + +SQL> INSERT INTO ROLE (ROLE_ID, ROLENAME) VALUES (300, 'STAFF'); + +1 row inserted. + +SQL> INSERT INTO ROLE (ROLE_ID, ROLENAME) VALUES (400, 'CUSTOMER'); + +1 row inserted. + +SQL> +SQL> -- SYSTEM ROLE +SQL> INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('ART', 'SYSTEM', '000-1234', 'arts@art.com', 1); + +1 row inserted. + +SQL> -- STAFF ROLE +SQL> INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Alice', 'Johnson', '650-555-9012', 'alice.johnson@art.com', 1); + +1 row inserted. + +SQL> INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ( 'Karen', 'Park', '206-555-0110', 'karen.park@art.com', 1); + +1 row inserted. + +SQL> INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ( 'Jeese', 'Taylor', '713-555-0106', 'grace.taylor@art.com', 1); + +1 row inserted. + +SQL> INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ( 'James', 'Lee', '206-555-0109', 'james.lee@art.com', 1); + +1 row inserted. + +SQL> -- SUPPLIER ROLE +SQL> INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Stephen', 'Alec', '424-546-9312', 'salec@eizel.com', 1); + +1 row inserted. + +SQL> INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Henry', 'Martinez', '602-555-0107', 'henry@artsupply.com', 1); + +1 row inserted. + +SQL> -- CUSTOMER ROLE +SQL> INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Carol', 'White', '212-555-0102', 'carol.white@mail.com', 1); + +1 row inserted. + +SQL> INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Bob', 'Smith', '212-555-0101', 'bob.smith@mail.com', 1); + +1 row inserted. + +SQL> INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('David', 'Brown', '312-555-0103', 'david.brown@mail.com', 1); + +1 row inserted. + +SQL> INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Emma', 'Davis', '312-555-0104', 'emma.davis@mail.com', 1); + +1 row inserted. + +SQL> INSERT INTO CONTACT ( FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL, MODIFIED_BY) VALUES ('Frank', 'Wilson', '713-555-0105', 'frank.wilson@mail.com', 1); + +1 row inserted. + +SQL> +SQL> INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('10001', 'New York', 'NY'); + +1 row inserted. + +SQL> INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('90210', 'Beverly Hills', 'CA'); + +1 row inserted. + +SQL> INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('94027', 'Atherton', 'CA'); + +1 row inserted. + +SQL> INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('90211', 'Los Angeles', 'CA'); + +1 row inserted. + +SQL> INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('60601', 'Chicago', 'IL'); + +1 row inserted. + +SQL> INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('77001', 'Houston', 'TX'); + +1 row inserted. + +SQL> INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('85001', 'Phoenix', 'AZ'); + +1 row inserted. + +SQL> INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('98101', 'Seattle', 'WA'); + +1 row inserted. + +SQL> INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('02101', 'Boston', 'MA'); + +1 row inserted. + +SQL> INSERT INTO ZIP (ZIP, CITY, STATE) VALUES ('33101', 'Miami', 'FL'); + +1 row inserted. + +SQL> +SQL> INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (1, '789 Oak St, suite 10', '94027'); + +1 row inserted. + +SQL> INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (2, '789 Oak St, suite 15', '94027'); + +1 row inserted. + +SQL> INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (3, '789 Oak St, suite 1', '94027'); + +1 row inserted. + +SQL> INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (4, '789 Oak St, suite 5', '94027'); + +1 row inserted. + +SQL> INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (5, '789 Oak St, suite 15', '94027'); + +1 row inserted. + +SQL> INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (6, '890 Venue Rd', '90210'); + +1 row inserted. + +SQL> INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (7, '200 Sunset Blvd', '90210'); + +1 row inserted. + +SQL> INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (8, '100 Broadway', '10001'); + +1 row inserted. + +SQL> INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (9, '300 Michigan Ave', '60601'); + +1 row inserted. + +SQL> INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP) VALUES (10, '400 Main St', '77001'); + +1 row inserted. + +SQL> INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP ) VALUES (11, '500 Central Ave', '85001'); + +1 row inserted. + +SQL> INSERT INTO ADDRESS (FK_CONTACT_ID, STREET, ZIP ) VALUES (12, '600 Pike St', '98101'); + +1 row inserted. + +SQL> +SQL> -- SYSTEMPROFILE +SQL> INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (1, TRUE, 1); + +1 row inserted. + +SQL> -- STAFF PROFILE +SQL> INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (2, TRUE, 2); + +1 row inserted. + +SQL> -- SUPPLIER +SQL> INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (3, TRUE, 3); + +1 row inserted. + +SQL> +SQL> INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (4, 4, TRUE, 1); + +1 row inserted. + +SQL> INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (5, 5, TRUE, 1); + +1 row inserted. + +SQL> INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (6, 6, TRUE, 1); + +1 row inserted. + +SQL> INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (7, 7, TRUE, 1); + +1 row inserted. + +SQL> INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (8, 8, FALSE, 1); + +1 row inserted. + +SQL> -- inactive +SQL> INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (9, 9, TRUE, 1); + +1 row inserted. + +SQL> INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (10, 10, TRUE, 1); + +1 row inserted. + +SQL> INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (11, 11, TRUE, 1); + +1 row inserted. + +SQL> INSERT INTO PROFILE (PROFILE_ID, FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (12, 12, TRUE, 1); + +1 row inserted. + +SQL> +SQL> +SQL> INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID, PASSWORDHASH) VALUES (1, 100, NULL); + +1 row inserted. + +SQL> INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (2, 300); + +1 row inserted. + +SQL> INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (3, 300); + +1 row inserted. + +SQL> INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (4, 300); + +1 row inserted. + +SQL> INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (5, 300); + +1 row inserted. + +SQL> INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (6, 200); + +1 row inserted. + +SQL> INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (7, 200); + +1 row inserted. + +SQL> INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (8, 400); + +1 row inserted. + +SQL> -- inactive customer +SQL> INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (9, 400); + +1 row inserted. + +SQL> INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (10, 400); + +1 row inserted. + +SQL> INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (11, 400); + +1 row inserted. + +SQL> INSERT INTO USERROLE (FK_PROFILE_ID, FK_ROLE_ID) VALUES (12, 400); + +1 row inserted. + +SQL> +SQL> INSERT INTO STAFF (FK_PROFILE_ID, POSITION) VALUES (2, 'Director'); + +1 row inserted. + +SQL> INSERT INTO STAFF (FK_PROFILE_ID, POSITION) VALUES (3, 'Registrar'); + +1 row inserted. + +SQL> INSERT INTO STAFF (FK_PROFILE_ID, POSITION) VALUES (4, 'Curator'); + +1 row inserted. + +SQL> INSERT INTO STAFF (FK_PROFILE_ID, POSITION) VALUES (5, 'Art Handler'); + +1 row inserted. + +SQL> +SQL> INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (2, 'https://art.com/docs/consignment-stephen-crimson-horizon.pdf'); + +1 row inserted. + +SQL> INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (3, 'https://art.com/docs/consignment-stephen-misty-valley.pdf'); + +1 row inserted. + +SQL> INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (4, 'https://art.com/docs/consignment-stephen-twisted-form.pdf'); + +1 row inserted. + +SQL> INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (5, 'https://art.com/docs/consignment-stephen-blue-symmetry.pdf'); + +1 row inserted. + +SQL> INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (6, 'https://art.com/docs/consignment-henry-urban-solitude.pdf'); + +1 row inserted. + +SQL> INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (7, 'https://art.com/docs/consignment-henry-earth-vessel.pdf'); + +1 row inserted. + +SQL> INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (8, 'https://art.com/docs/consignment-henry-quiet-reflection.pdf'); + +1 row inserted. + +SQL> +SQL> -- Stephen — approved +SQL> INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) + 2 VALUES ('approved', 6, 2, 1, SYSDATE, SYSDATE + 365); + +1 row inserted. + +SQL> -- Stephen — approved +SQL> INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) + 2 VALUES ('approved', 6, 3, 1, SYSDATE, SYSDATE + 365); + +1 row inserted. + +SQL> -- Stephen — pending ('pending' status path) +SQL> INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) + 2 VALUES ('pending', 6, 4, 1, SYSDATE, SYSDATE + 365); + +1 row inserted. + +SQL> -- Stephen — rejected ('rejected' status path) +SQL> INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) + 2 VALUES ('rejected', 6, 5, 1, SYSDATE, SYSDATE + 30); + +1 row inserted. + +SQL> -- Henry — approved +SQL> INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) + 2 VALUES ('approved', 7, 6, 1, SYSDATE, SYSDATE + 365); + +1 row inserted. + +SQL> -- Henry — approved +SQL> INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) + 2 VALUES ('approved', 7, 7, 1, SYSDATE, SYSDATE + 365); + +1 row inserted. + +SQL> -- Henry — approved +SQL> INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) + 2 VALUES ('approved', 7, 8, 1, SYSDATE, SYSDATE + 365); + +1 row inserted. + +SQL> -- Henry — pending +SQL> INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) + 2 VALUES ('pending', 7, 7, 1, SYSDATE, SYSDATE + 180); + +1 row inserted. + +SQL> -- Henry — expired (EXPIRATION_DATE in the past) +SQL> INSERT INTO AUTHORIZATION (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE) + 2 VALUES ('expired', 7, 8, 1, SYSDATE - 365, SYSDATE - 30); + +1 row inserted. + +SQL> +SQL> -- PLAN Documents for exhibition +SQL> INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (9, 'https://art.com/docs/plan-spring-gala-2025.pdf'); + +1 row inserted. + +SQL> INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (10, 'https://art.com/docs/plan-summer-exhibit-2025.pdf'); + +1 row inserted. + +SQL> INSERT INTO DOCUMENT (DOCUMENT_ID, DOCUMENT_URL) VALUES (11, 'https://art.com/docs/plan-fall-exhibition-2025.pdf'); + +1 row inserted. + +SQL> +SQL> -- PLANS +SQL> INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Spring Gala Preview', 9, 4, 75.00, 1); + +1 row inserted. + +SQL> -- PLAN_ID 1 +SQL> INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Spring Gala Standard', 9, 8, 120.00, 1); + +1 row inserted. + +SQL> -- PLAN_ID 2 +SQL> INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Spring Gala VIP', 9, 12, 250.00, 1); + +1 row inserted. + +SQL> -- PLAN_ID 3 +SQL> INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Summer Exhibit Basic', 10, 4, 50.00, 1); + +1 row inserted. + +SQL> -- PLAN_ID 4 +SQL> INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Summer Exhibit Plus', 10, 8, 100.00, 1); + +1 row inserted. + +SQL> -- PLAN_ID 5 +SQL> INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Summer Exhibit Premium', 10, 16, 200.00, 1); + +1 row inserted. + +SQL> -- PLAN_ID 6 +SQL> INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Fall Exhibition Access', 11, 4, 60.00, 1); + +1 row inserted. + +SQL> -- PLAN_ID 7 +SQL> INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Fall Exhibition Full Day',11, 8, 110.00, 1); + +1 row inserted. + +SQL> -- PLAN_ID 8 +SQL> INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Fall Exhibition Weekend', 11, 24, 180.00, 1); + +1 row inserted. + +SQL> -- PLAN_ID 9 +SQL> INSERT INTO PLAN (DESCRIPTION, FK_DOCUMENT_ID, DURATION, PRICE, MODIFIED_BY) VALUES ('Annual Patron Pass', 11, 200, 500.00, 1); + +1 row inserted. + +SQL> -- PLAN_ID 10 +SQL> +SQL> -- IV 1 — Crimson Horizon +SQL> INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + 2 PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) + 3 VALUES (6, 1, 'ART-S-001', + 4 'Oil on canvas, abstract expressionism, 24x36', 800.00, 7, + 5 'Crimson Horizon', 'piece', 1200.00, 5, 2); + +1 row inserted. + +SQL> +SQL> -- IV 2 — Misty Valley +SQL> INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + 2 PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + 3 PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) + 4 VALUES (6, 2, 'ART-S-002', + 5 'Watercolor on paper, landscape, 18x24', 450.00, 5, + 6 'Misty Valley', 'piece', 700.00, 5, 3); + +1 row inserted. + +SQL> +SQL> -- IV 3 — Twisted Form +SQL> INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + 2 PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + 3 PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) + 4 VALUES (6, 3, 'ART-S-003', + 5 'Bronze sculpture, abstract, 12 in height', 1500.00, 14, + 6 'Twisted Form', 'piece', 2200.00, 5, 4); + +1 row inserted. + +SQL> +SQL> -- IV 4 — Blue Symmetry +SQL> INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + 2 PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + 3 PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) + 4 VALUES (7, 1, 'ART-S-004', + 5 'Acrylic on canvas, geometric, 30x30', 600.00, 7, + 6 'Blue Symmetry', 'piece', 950.00, 5, 2); + +1 row inserted. + +SQL> +SQL> -- IV 5 — Urban Collage +SQL> INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + 2 PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + 3 PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) + 4 VALUES (7, 2, 'ART-S-005', + 5 'Mixed media on board, 20x20', 350.00, 5, + 6 'Urban Collage', 'piece', 550.00, 6, 3); + +1 row inserted. + +SQL> +SQL> -- IV 6 — Urban Solitude +SQL> INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + 2 PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + 3 PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) + 4 VALUES (6, 6, 'ART-H-001', + 5 'Photography print, archival, limited ed 1/10', 900.00, 3, + 6 'Urban Solitude', 'piece', 1500.00, 10, 6); + +1 row inserted. + +SQL> +SQL> -- IV 7 — Earth Vessel +SQL> INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + 2 PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + 3 PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) + 4 VALUES (7, 7, 'ART-H-002', + 5 'Ceramic vessel, hand-thrown and glazed', 250.00, 10, + 6 'Earth Vessel', 'piece', 420.00, 8, 7); + +1 row inserted. + +SQL> +SQL> -- IV 8 — Quiet Reflection +SQL> INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + 2 PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + 3 PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) + 4 VALUES (7, 8, 'ART-H-003', + 5 'Pastel drawing, portrait, 16x20', 300.00, 7, + 6 'Quiet Reflection','piece', 500.00, 4, 8); + +1 row inserted. + +SQL> +SQL> -- IV 9 — Neon Dreams +SQL> INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + 2 PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + 3 PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) + 4 VALUES (6, 6, 'ART-H-004', + 5 'Digital print on aluminum, 24x36', 700.00, 5, + 6 'Neon Dreams', 'piece', 1100.00, 6, 6); + +1 row inserted. + +SQL> +SQL> -- IV 10 — Woven Stories +SQL> INSERT INTO INVENTORY (FK_CONTACT_ID, AUTHORIZATION_ID, SKU, + 2 PRODUCT_DESCRIPTION, UNIT_COST, LEAD_TIME_DAYS, + 3 PRODUCT_NAME, UNIT_OF_MEASURE, BASE_PRICE, QUANTITY_AVAILABLE, FK_DOCUMENT_ID) + 4 VALUES (6, 7, 'ART-H-005', + 5 'Textile wall hanging, woven, 36x48', 550.00, 14, + 6 'Woven Stories', 'piece', 850.00, 5, 7); + +1 row inserted. + +SQL> +SQL> INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (1, 1); + +1 row inserted. + +SQL> -- Crimson Horizon → Spring Preview +SQL> INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (2, 2); + +1 row inserted. + +SQL> -- Misty Valley → Spring Standard +SQL> INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (3, 3); + +1 row inserted. + +SQL> -- Twisted Form → Spring VIP +SQL> INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (4, 4); + +1 row inserted. + +SQL> -- Blue Symmetry → Summer Basic +SQL> INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (5, 5); + +1 row inserted. + +SQL> -- Urban Collage → Summer Plus +SQL> INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (6, 6); + +1 row inserted. + +SQL> -- Urban Solitude → Summer Premium +SQL> INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (7, 7); + +1 row inserted. + +SQL> -- Earth Vessel → Fall Access +SQL> INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (8, 8); + +1 row inserted. + +SQL> -- Quiet Reflection → Fall Full Day +SQL> INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (9, 9); + +1 row inserted. + +SQL> -- Neon Dreams → Fall Weekend +SQL> INSERT INTO EXHIBIT (FK_INVENTORY_ID, FK_PLAN_ID) VALUES (10, 10); + +1 row inserted. + +SQL> -- Woven Stories → Annual Pass +SQL> +SQL> +SQL> INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (9, 1, DATE'2025-01-01', 75.00); +SUBSCRIPTION transaction. + + +1 row inserted. + +SQL> -- Bob — Spring Preview +SQL> INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (10, 2, DATE'2025-01-02', 120.00); +SUBSCRIPTION transaction. + + +1 row inserted. + +SQL> -- Carol — Spring Standard +SQL> INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (11, 3, DATE'2025-01-03', 250.00); +SUBSCRIPTION transaction. + + +1 row inserted. + +SQL> -- David — Spring VIP +SQL> INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (12, 4, DATE'2025-01-04', 50.00); +SUBSCRIPTION transaction. + + +1 row inserted. + +SQL> -- Emma — Summer Basic +SQL> INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (9, 5, DATE'2025-01-05', 100.00); +SUBSCRIPTION transaction. + + +1 row inserted. + +SQL> -- Bob — Summer Plus +SQL> INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (10, 6, DATE'2025-01-06', 150.00); +SUBSCRIPTION transaction. + + +1 row inserted. + +SQL> -- Carol — Summer Premium +SQL> INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (11, 7, DATE'2025-01-07', 60.00); +SUBSCRIPTION transaction. + + +1 row inserted. + +SQL> -- David — Fall Access +SQL> INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (12, 8, DATE'2025-01-08', 110.00); +SUBSCRIPTION transaction. + + +1 row inserted. + +SQL> -- Emma — Fall Full Day +SQL> INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (9, 9, DATE'2025-01-09', 180.00); +SUBSCRIPTION transaction. + + +1 row inserted. + +SQL> -- Bob — Fall Weekend +SQL> INSERT INTO INVOICE (FK_CONTACT_ID, FK_PLAN_ID, InvoiceDate, AmountPaid) VALUES (10, 10, DATE'2025-01-10', 500.00); +SUBSCRIPTION transaction. + + +1 row inserted. + +SQL> -- Carol — Annual Pass +SQL> +SQL> / diff --git a/schema/Price_Sherwin_DML.sql b/schema/Price_Sherwin_DML.sql new file mode 100755 index 0000000..effa919 --- /dev/null +++ b/schema/Price_Sherwin_DML.sql @@ -0,0 +1,152 @@ +-- ORACLE SQL DML: SCHEMA C##ART +SET ECHO ON; +SET SERVEROUTPUT ON; +SET PAGESIZE 30; +SET HEADING ON; + +-- 20 Queries +-- Q1: Select all columns and all rows from one table +SELECT * FROM ROLE; + +-- Q2: Select five columns and all rows from one table +SELECT CONTACT_ID, FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL FROM CONTACT; + +-- Q3: Select all columns from all rows from one view +SELECT * FROM VIEW_AVAILABLE_INVENTORY; + +-- Q4: Using a join on 2 tables, select all columns and all rows from the tables without the use of a Cartesian product +SELECT * FROM CONTACT ct +JOIN ADDRESS ad ON ad.FK_CONTACT_ID=ct.CONTACT_ID; + +-- Q5: 5: Select and order data retrieved from one table +SELECT * FROM ZIP ORDER BY 1; + +-- Q6: Using a join on 3 tables, select 5 columns from the 3 tables. Use syntax that would limit the output to 10 rows +SELECT iv.SKU, iv.PRODUCT_NAME,iv.BASE_PRICE,iv.LEAD_TIME_DAYS, iv.QUANTITY_AVAILABLE, + au.AUTHORIZATION_STATUS, au.EXPIRATION_DATE, au.AUTHORIZATION_DATE, c.*, au.FK_DOCUMENT_ID +FROM INVENTORY iv +JOIN "AUTHORIZATION" au ON au.AUTHORIZATION_ID = iv.AUTHORIZATION_ID +join CONTACT c ON c.CONTACT_ID= iv.FK_CONTACT_ID +FETCH FIRST 10 ROWS ONLY; + +--Q7: Select distinct rows using joins on 3 tables +SELECT DISTINCT iv.SKU, iv.PRODUCT_NAME,iv.BASE_PRICE,iv.LEAD_TIME_DAYS, iv.QUANTITY_AVAILABLE, + au.AUTHORIZATION_STATUS, au.EXPIRATION_DATE, au.AUTHORIZATION_DATE, au.FK_CONTACT_ID, au.FK_DOCUMENT_ID, + oi.ORDER_ITEM_ID, oi.QUANTITY, oi.UNIT_PRICE, oi.TRANSACTION_ID, oi.LINE_TOTAL +FROM INVENTORY iv +JOIN "AUTHORIZATION" au ON au.AUTHORIZATION_ID = iv.AUTHORIZATION_ID +JOIN ORDER_ITEMS oi ON oi.FK_INVENTORY_ID = iv.INVENTORY_ID; + +-- Q8: Use GROUP BY and HAVING in a select statement using one or more tables +SELECT iv.SKU +FROM INVENTORY iv +JOIN "AUTHORIZATION" au ON au.AUTHORIZATION_ID = iv.AUTHORIZATION_ID +JOIN ORDER_ITEMS oi ON oi.FK_INVENTORY_ID = iv.INVENTORY_ID +GROUP BY iv.SKU, iv.QUANTITY_AVAILABLE HAVING iv.QUANTITY_AVAILABLE > 0; + +-- Q9: Use IN clause to select data from one or more tables +SELECT * FROM PROFILE pf JOIN USERROLE ur ON pf.PROFILE_ID = ur.FK_PROFILE_ID WHERE ur.FK_ROLE_ID IN (100, 200, 300); + +-- Q10: Select length of one column from one table (use LENGTH function) +SELECT LENGTH(ROLENAME) FROM ROLE; + +-- Q11: Delete one record from one table. ROLLBACK afterwards so that the data will not be physically removed. +SAVEPOINT sp1; + +SELECT * FROM PROFILE pf JOIN USERROLE ur ON pf.PROFILE_ID = ur.FK_PROFILE_ID WHERE ur.FK_ROLE_ID IN (100, 200, 300); +DELETE USERROLE WHERE FK_PROFILE_ID=3 AND FK_ROLE_ID=300; +SELECT * FROM PROFILE pf JOIN USERROLE ur ON pf.PROFILE_ID = ur.FK_PROFILE_ID WHERE ur.FK_ROLE_ID IN (100, 200, 300); + +ROLLBACK TO SAVEPOINT sp1; + +-- Q12: Update one record from one table. demonstrate table contents before and after the UPDATE. +SELECT * FROM PROFILE WHERE PROFILE_ID=3; +UPDATE PROFILE SET ACTIVE = FALSE WHERE PROFILE_ID=3; +SELECT * FROM PROFILE WHERE PROFILE_ID=3; + +ROLLBACK TO SAVEPOINT sp1; +COMMIT; + +-- Q13: Plans show +SELECT * FROM PLAN pl +LEFT OUTER JOIN DOCUMENT doc ON pl.FK_DOCUMENT_ID = doc.DOCUMENT_ID; + +-- Q14: show authorized suppliers whose expiration date is greater than 30 days from now. +SELECT * FROM VIEW_SUPPLIER vsu +LEFT OUTER JOIN AUTHORIZATION aut ON aut.FK_CONTACT_ID = vsu.FK_CONTACT_ID +WHERE aut.AUTHORIZATION_STATUS='approved' AND aut.EXPIRATION_DATE > SYSDATE+30; + +-- Q15: +SELECT r.ROLENAME, ct.FIRST_NAME, ct.LAST_NAME, pl.DESCRIPTION FROM SUBSCRIPTION srp +LEFT OUTER JOIN CONTACT ct ON srp.FK_CONTACT_ID = ct.CONTACT_ID +LEFT OUTER JOIN PROFILE pf ON pf.FK_CONTACT_ID = ct.CONTACT_ID +LEFT OUTER JOIN USERROLE ur ON ur.FK_PROFILE_ID = pf.PROFILE_ID +LEFT OUTER JOIN ROLE r ON r.ROLE_ID = ur.FK_ROLE_ID +LEFT OUTER JOIN PLAN pl ON srp.FK_PLAN_ID = pl.PLAN_ID; + +-- Q16: +SELECT ct.FIRST_NAME, ct.LAST_NAME, adr.STREET, z.CITY, z.STATE, z.ZIP +FROM ADDRESS adr +LEFT OUTER JOIN CONTACT ct ON adr.FK_CONTACT_ID = ct.CONTACT_ID +LEFT OUTER JOIN ZIP z ON adr.ZIP = z.ZIP; + +-- Q17: +SELECT COALESCE(vws.ROLENAME, vwsp.ROLENAME, vwc.ROLENAME, vwsys.ROLENAME) AS ROLENAME, + COALESCE(vws.ACTIVE, vwsp.ACTIVE, vwc.ACTIVE, vwsys.ACTIVE) AS ACTIVE, + ct.FIRST_NAME, ct.LAST_NAME, adr.STREET, z.CITY, z.STATE, z.ZIP +FROM ADDRESS adr +LEFT OUTER JOIN CONTACT ct ON adr.FK_CONTACT_ID = ct.CONTACT_ID +LEFT OUTER JOIN ZIP z ON adr.ZIP = z.ZIP +LEFT OUTER JOIN VIEW_STAFF vws ON vws.FK_CONTACT_ID = ct.CONTACT_ID +LEFT OUTER JOIN VIEW_SUPPLIER vwsp ON vwsp.FK_CONTACT_ID = ct.CONTACT_ID +LEFT OUTER JOIN VIEW_CUSTOMER vwc ON vwc.FK_CONTACT_ID = ct.CONTACT_ID +LEFT OUTER JOIN VIEW_SYSTEMROLE vwsys ON vwsys.FK_CONTACT_ID = ct.CONTACT_ID; + +-- Q18: Verify rows in tables +SELECT 'CONTACT' AS TABLE_NAME, COUNT(*) AS ROW_COUNT FROM CONTACT UNION ALL +SELECT 'ZIP', COUNT(*) FROM ZIP UNION ALL +SELECT 'ADDRESS', COUNT(*) FROM ADDRESS UNION ALL +SELECT 'ROLE', COUNT(*) FROM ROLE UNION ALL +SELECT 'PROFILE', COUNT(*) FROM PROFILE UNION ALL +SELECT 'USERROLE', COUNT(*) FROM USERROLE UNION ALL +SELECT 'STAFF', COUNT(*) FROM STAFF UNION ALL +SELECT 'DOCUMENT', COUNT(*) FROM DOCUMENT UNION ALL +SELECT 'AUTHORIZATION', COUNT(*) FROM AUTHORIZATION UNION ALL +SELECT 'PLAN', COUNT(*) FROM PLAN UNION ALL +SELECT 'INVENTORY', COUNT(*) FROM INVENTORY UNION ALL +SELECT 'EXHIBIT', COUNT(*) FROM EXHIBIT UNION ALL +SELECT 'ORDER_ITEMS', COUNT(*) FROM ORDER_ITEMS UNION ALL +SELECT 'INVOICE', COUNT(*) FROM INVOICE UNION ALL +SELECT 'SUBSCRIPTION', COUNT(*) FROM SUBSCRIPTION UNION ALL +SELECT 'TASK_HISTORY', COUNT(*) FROM TASK_HISTORY +ORDER BY TABLE_NAME; + +-- Q19: rough check uniqueness: across tables columns +SELECT RPAD(idx.TABLE_NAME,15,' '), COUNT( col.column_name ), COUNT( col.TABLE_NAME ) +FROM user_indexes idx +JOIN user_ind_columns col ON ( col.index_name = idx.index_name ) +WHERE idx.uniqueness = 'UNIQUE' +GROUP BY idx.TABLE_NAME; + +-- Q20: Likely weak entity tables; +SELECT pk.table_name + -- LISTAGG(pk.column_name, ', ') WITHIN GROUP (ORDER BY pk.position) AS primary_key_columns, + -- LISTAGG(fk.column_name, ', ') WITHIN GROUP (ORDER BY fk.position) AS foreign_key_columns +FROM all_cons_columns pk +JOIN all_constraints pkc + ON pk.constraint_name = pkc.constraint_name + AND pk.owner = pkc.owner +JOIN all_cons_columns fk + ON pk.table_name = fk.table_name + AND pk.owner = fk.owner +JOIN all_constraints fkc + ON fk.constraint_name = fkc.constraint_name + AND fk.owner = fkc.owner +WHERE pkc.constraint_type = 'P' -- Primary key + AND fkc.constraint_type = 'R' -- Foreign key + AND pk.column_name = fk.column_name -- PK column is also FK column + AND pk.owner = USER +GROUP BY pk.table_name +ORDER BY pk.table_name;-- CREATE SCHEMA + +/ diff --git a/schema/Price_Sherwin_DML_output.txt b/schema/Price_Sherwin_DML_output.txt new file mode 100755 index 0000000..7b70073 --- /dev/null +++ b/schema/Price_Sherwin_DML_output.txt @@ -0,0 +1,435 @@ +SQL> -- ORACLE SQL DML: SCHEMA C##ART +SQL> SET ECHO ON; +SQL> SET SERVEROUTPUT ON; +SQL> SET PAGESIZE 30; +SQL> SET HEADING ON; +SQL> +SQL> -- 20 Queries +SQL> -- Q1: Select all columns and all rows from one table +SQL> SELECT * FROM ROLE; + + ROLE_ID ROLENAME +---------- ---------------- + 100 SYSTEM + 200 SUPPLIER + 300 STAFF + 400 CUSTOMER + +SQL> +SQL> -- Q2: Select five columns and all rows from one table +SQL> SELECT CONTACT_ID, FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL FROM CONTACT; + +CONTACT_ID FIRST_NAME LAST_NAME PHONE_NO EMAIL +---------- ---------------- ---------------- ------------ ---------------------------------------------------------------- + 1 ART SYSTEM 000-1234 arts@art.com + 2 Alice Johnson 650-555-9012 alice.johnson@art.com + 3 Karen Park 206-555-0110 karen.park@art.com + 4 Jeese Taylor 713-555-0106 grace.taylor@art.com + 5 James Lee 206-555-0109 james.lee@art.com + 6 Stephen Alec 424-546-9312 salec@eizel.com + 7 Henry Martinez 602-555-0107 henry@artsupply.com + 8 Carol White 212-555-0102 carol.white@mail.com + 9 Bob Smith 212-555-0101 bob.smith@mail.com + 10 David Brown 312-555-0103 david.brown@mail.com + 11 Emma Davis 312-555-0104 emma.davis@mail.com + 12 Frank Wilson 713-555-0105 frank.wilson@mail.com + +12 rows selected. + +SQL> +SQL> -- Q3: Select all columns from all rows from one view +SQL> SELECT * FROM VIEW_AVAILABLE_INVENTORY; +no rows selected +SQL> +SQL> -- Q4: Using a join on 2 tables, select all columns and all rows from the tables without the use of a Cartesian product +SQL> SELECT * FROM CONTACT ct + 2 JOIN ADDRESS ad ON ad.FK_CONTACT_ID=ct.CONTACT_ID; + +CONTACT_ID FIRST_NAME LAST_NAME PHONE_NO EMAIL MODIFIED_BY CREATED_DT MODIFIED_DT ZIP FK_CONTACT_ID STREET +---------- ---------------- ---------------- ------------ ---------------------------------------------------------------- ----------- ------------------------------- ------------------------------- ----- ------------- -------------------------------- + 1 ART SYSTEM 000-1234 arts@art.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 94027 1 789 Oak St, suite 10 + 2 Alice Johnson 650-555-9012 alice.johnson@art.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 94027 2 789 Oak St, suite 15 + 3 Karen Park 206-555-0110 karen.park@art.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 94027 3 789 Oak St, suite 1 + 4 Jeese Taylor 713-555-0106 grace.taylor@art.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 94027 4 789 Oak St, suite 5 + 5 James Lee 206-555-0109 james.lee@art.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 94027 5 789 Oak St, suite 15 + 6 Stephen Alec 424-546-9312 salec@eizel.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 90210 6 890 Venue Rd + 7 Henry Martinez 602-555-0107 henry@artsupply.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 90210 7 200 Sunset Blvd + 8 Carol White 212-555-0102 carol.white@mail.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 10001 8 100 Broadway + 9 Bob Smith 212-555-0101 bob.smith@mail.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 60601 9 300 Michigan Ave + 10 David Brown 312-555-0103 david.brown@mail.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 77001 10 400 Main St + 11 Emma Davis 312-555-0104 emma.davis@mail.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 85001 11 500 Central Ave + 12 Frank Wilson 713-555-0105 frank.wilson@mail.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 98101 12 600 Pike St + +12 rows selected. + +SQL> +SQL> -- Q5: 5: Select and order data retrieved from one table +SQL> SELECT * FROM ZIP ORDER BY 1; + +ZIP CITY ST +----- ---------------- -- +02101 Boston MA +10001 New York NY +33101 Miami FL +60601 Chicago IL +77001 Houston TX +85001 Phoenix AZ +90210 Beverly Hills CA +90211 Los Angeles CA +94027 Atherton CA +98101 Seattle WA + +10 rows selected. + +SQL> +SQL> -- Q6: Using a join on 3 tables, select 5 columns from the 3 tables. Use syntax that would limit the output to 10 rows +SQL> SELECT iv.SKU, iv.PRODUCT_NAME,iv.BASE_PRICE,iv.LEAD_TIME_DAYS, iv.QUANTITY_AVAILABLE, + 2 au.AUTHORIZATION_STATUS, au.EXPIRATION_DATE, au.AUTHORIZATION_DATE, c.*, au.FK_DOCUMENT_ID + 3 FROM INVENTORY iv + 4 JOIN "AUTHORIZATION" au ON au.AUTHORIZATION_ID = iv.AUTHORIZATION_ID + 5 join CONTACT c ON c.CONTACT_ID= iv.FK_CONTACT_ID + 6 FETCH FIRST 10 ROWS ONLY; + +SKU PRODUCT_NAME BASE_PRICE LEAD_TIME_DAYS QUANTITY_AVAILABLE AUTHORIZATION_ST EXPIRATION_DATE AUTHORIZATION_DATE CONTACT_ID FIRST_NAME LAST_NAME PHONE_NO EMAIL MODIFIED_BY CREATED_DT MODIFIED_DT FK_DOCUMENT_ID +---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ---------- -------------- ------------------ ---------------- ------------------------------- ------------------------------- ---------- ---------------- ---------------- ------------ ---------------------------------------------------------------- ----------- ------------------------------- ------------------------------- -------------- +ART-S-001 Crimson Horizon 1200 7 5 approved 28-MAR-27 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 6 Stephen Alec 424-546-9312 salec@eizel.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 2 +ART-S-002 Misty Valley 700 5 5 approved 28-MAR-27 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 6 Stephen Alec 424-546-9312 salec@eizel.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 3 +ART-S-003 Twisted Form 2200 14 5 pending 28-MAR-27 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 6 Stephen Alec 424-546-9312 salec@eizel.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 4 +ART-H-001 Urban Solitude 1500 3 10 approved 28-MAR-27 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 6 Stephen Alec 424-546-9312 salec@eizel.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 7 +ART-H-004 Neon Dreams 1100 5 6 approved 28-MAR-27 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 6 Stephen Alec 424-546-9312 salec@eizel.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 7 +ART-H-005 Woven Stories 850 14 5 approved 28-MAR-27 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 6 Stephen Alec 424-546-9312 salec@eizel.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 8 +ART-S-004 Blue Symmetry 950 7 5 approved 28-MAR-27 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 7 Henry Martinez 602-555-0107 henry@artsupply.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 2 +ART-S-005 Urban Collage 550 5 6 approved 28-MAR-27 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 7 Henry Martinez 602-555-0107 henry@artsupply.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 3 +ART-H-002 Earth Vessel 420 10 8 approved 28-MAR-27 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 7 Henry Martinez 602-555-0107 henry@artsupply.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 8 +ART-H-003 Quiet Reflection 500 7 4 pending 24-SEP-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 7 Henry Martinez 602-555-0107 henry@artsupply.com 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 7 + +10 rows selected. + +SQL> +SQL> --Q7: Select distinct rows using joins on 3 tables +SQL> SELECT DISTINCT iv.SKU, iv.PRODUCT_NAME,iv.BASE_PRICE,iv.LEAD_TIME_DAYS, iv.QUANTITY_AVAILABLE, + 2 au.AUTHORIZATION_STATUS, au.EXPIRATION_DATE, au.AUTHORIZATION_DATE, au.FK_CONTACT_ID, au.FK_DOCUMENT_ID, + 3 oi.ORDER_ITEM_ID, oi.QUANTITY, oi.UNIT_PRICE, oi.TRANSACTION_ID, oi.LINE_TOTAL + 4 FROM INVENTORY iv + 5 JOIN "AUTHORIZATION" au ON au.AUTHORIZATION_ID = iv.AUTHORIZATION_ID + 6 JOIN ORDER_ITEMS oi ON oi.FK_INVENTORY_ID = iv.INVENTORY_ID; +no rows selected +SQL> +SQL> -- Q8: Use GROUP BY and HAVING in a select statement using one or more tables +SQL> SELECT iv.SKU + 2 FROM INVENTORY iv + 3 JOIN "AUTHORIZATION" au ON au.AUTHORIZATION_ID = iv.AUTHORIZATION_ID + 4 JOIN ORDER_ITEMS oi ON oi.FK_INVENTORY_ID = iv.INVENTORY_ID + 5 GROUP BY iv.SKU, iv.QUANTITY_AVAILABLE HAVING iv.QUANTITY_AVAILABLE > 0; +no rows selected +SQL> +SQL> -- Q9: Use IN clause to select data from one or more tables +SQL> SELECT * FROM PROFILE pf JOIN USERROLE ur ON pf.PROFILE_ID = ur.FK_PROFILE_ID WHERE ur.FK_ROLE_ID IN (100, 200, 300); + +PROFILE_ID FK_CONTACT_ID ACTIV MODIFIED_BY CREATED_DT MODIFIED_DT FK_PROFILE_ID FK_ROLE_ID PASSWORDHASH +---------- ------------- ----- ----------- ------------------------------- ------------------------------- ------------- ---------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1 1 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 1 100 + 2 2 true 2 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 2 300 + 3 3 true 3 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 3 300 + 4 4 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 4 300 + 5 5 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 5 300 + 6 6 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 6 200 + 7 7 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 7 200 + +7 rows selected. + +SQL> +SQL> -- Q10: Select length of one column from one table (use LENGTH function) +SQL> SELECT LENGTH(ROLENAME) FROM ROLE; + +LENGTH(ROLENAME) +---------------- + 6 + 8 + 5 + 8 + +SQL> +SQL> -- Q11: Delete one record from one table. ROLLBACK afterwards so that the data will not be physically removed. +SQL> SAVEPOINT sp1; + +Savepoint created. + +SQL> +SQL> SELECT * FROM PROFILE pf JOIN USERROLE ur ON pf.PROFILE_ID = ur.FK_PROFILE_ID WHERE ur.FK_ROLE_ID IN (100, 200, 300); + +PROFILE_ID FK_CONTACT_ID ACTIV MODIFIED_BY CREATED_DT MODIFIED_DT FK_PROFILE_ID FK_ROLE_ID PASSWORDHASH +---------- ------------- ----- ----------- ------------------------------- ------------------------------- ------------- ---------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1 1 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 1 100 + 2 2 true 2 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 2 300 + 3 3 true 3 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 3 300 + 4 4 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 4 300 + 5 5 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 5 300 + 6 6 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 6 200 + 7 7 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 7 200 + +7 rows selected. + +SQL> DELETE USERROLE WHERE FK_PROFILE_ID=3 AND FK_ROLE_ID=300; + +1 row deleted. + +SQL> SELECT * FROM PROFILE pf JOIN USERROLE ur ON pf.PROFILE_ID = ur.FK_PROFILE_ID WHERE ur.FK_ROLE_ID IN (100, 200, 300); + +PROFILE_ID FK_CONTACT_ID ACTIV MODIFIED_BY CREATED_DT MODIFIED_DT FK_PROFILE_ID FK_ROLE_ID PASSWORDHASH +---------- ------------- ----- ----------- ------------------------------- ------------------------------- ------------- ---------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1 1 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 1 100 + 2 2 true 2 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 2 300 + 4 4 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 4 300 + 5 5 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 5 300 + 6 6 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 6 200 + 7 7 true 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 7 200 + +6 rows selected. + +SQL> +SQL> ROLLBACK TO SAVEPOINT sp1; + +Rollback complete. + +SQL> +SQL> -- Q12: Update one record from one table. demonstrate table contents before and after the UPDATE. +SQL> SELECT * FROM PROFILE WHERE PROFILE_ID=3; + +PROFILE_ID FK_CONTACT_ID ACTIV MODIFIED_BY CREATED_DT MODIFIED_DT +---------- ------------- ----- ----------- ------------------------------- ------------------------------- + 3 3 true 3 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM + +SQL> UPDATE PROFILE SET ACTIVE = FALSE WHERE PROFILE_ID=3; + +1 row updated. + +SQL> SELECT * FROM PROFILE WHERE PROFILE_ID=3; + +PROFILE_ID FK_CONTACT_ID ACTIV MODIFIED_BY CREATED_DT MODIFIED_DT +---------- ------------- ----- ----------- ------------------------------- ------------------------------- + 3 3 false 3 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM + +SQL> +SQL> ROLLBACK TO SAVEPOINT sp1; + +Rollback complete. + +SQL> COMMIT; + +Commit complete. + +SQL> +SQL> -- Q13: Plans show +SQL> SELECT * FROM PLAN pl + 2 LEFT OUTER JOIN DOCUMENT doc ON pl.FK_DOCUMENT_ID = doc.DOCUMENT_ID; + + PLAN_ID DESCRIPTION FK_DOCUMENT_ID DURATION PRICE MODIFIED_BY CREATED_DT MODIFIED_DT DOCUMENT_ID DOCUMENT_URL +---------- -------------------------------- -------------- ---------- ---------- ----------- ------------------------------- ------------------------------- ----------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1 Spring Gala Preview 9 4 75 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 9 https://art.com/docs/plan-spring-gala-2025.pdf + 2 Spring Gala Standard 9 8 120 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 9 https://art.com/docs/plan-spring-gala-2025.pdf + 3 Spring Gala VIP 9 12 250 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 9 https://art.com/docs/plan-spring-gala-2025.pdf + 4 Summer Exhibit Basic 10 4 50 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 10 https://art.com/docs/plan-summer-exhibit-2025.pdf + 5 Summer Exhibit Plus 10 8 100 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 10 https://art.com/docs/plan-summer-exhibit-2025.pdf + 6 Summer Exhibit Premium 10 16 200 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 10 https://art.com/docs/plan-summer-exhibit-2025.pdf + 7 Fall Exhibition Access 11 4 60 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 11 https://art.com/docs/plan-fall-exhibition-2025.pdf + 8 Fall Exhibition Full Day 11 8 110 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 11 https://art.com/docs/plan-fall-exhibition-2025.pdf + 9 Fall Exhibition Weekend 11 24 180 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 11 https://art.com/docs/plan-fall-exhibition-2025.pdf + 10 Annual Patron Pass 11 200 500 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM 11 https://art.com/docs/plan-fall-exhibition-2025.pdf + +10 rows selected. + +SQL> +SQL> -- Q14: show authorized suppliers whose expiration date is greater than 30 days from now. +SQL> SELECT * FROM VIEW_SUPPLIER vsu + 2 LEFT OUTER JOIN AUTHORIZATION aut ON aut.FK_CONTACT_ID = vsu.FK_CONTACT_ID + 3 WHERE aut.AUTHORIZATION_STATUS='approved' AND aut.EXPIRATION_DATE > SYSDATE+30; + +FK_PROFILE_ID FK_CONTACT_ID ROLENAME ACTIV FIRST_NAME LAST_NAME AUTHORIZATION_ID FK_CONTACT_ID AUTHORIZATION_ST AUTHORIZATION_DATE EXPIRATION_DATE FK_DOCUMENT_ID MODIFIED_BY CREATED_DT MODIFIED_DT +------------- ------------- ---------------- ----- ---------------- ---------------- ---------------- ------------- ---------------- ------------------------------- ------------------------------- -------------- ----------- ------------------------------- ------------------------------- + 6 6 SUPPLIER true Stephen Alec 1 6 approved 28-MAR-26 02.36.34.000000000 AM 28-MAR-27 02.36.34.000000000 AM 2 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM + 6 6 SUPPLIER true Stephen Alec 2 6 approved 28-MAR-26 02.36.34.000000000 AM 28-MAR-27 02.36.34.000000000 AM 3 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM + 7 7 SUPPLIER true Henry Martinez 5 7 approved 28-MAR-26 02.36.34.000000000 AM 28-MAR-27 02.36.34.000000000 AM 6 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM + 7 7 SUPPLIER true Henry Martinez 6 7 approved 28-MAR-26 02.36.34.000000000 AM 28-MAR-27 02.36.34.000000000 AM 7 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM + 7 7 SUPPLIER true Henry Martinez 7 7 approved 28-MAR-26 02.36.34.000000000 AM 28-MAR-27 02.36.34.000000000 AM 8 1 28-MAR-26 02.36.34.000000000 AM 28-MAR-26 02.36.34.000000000 AM + +SQL> +SQL> -- Q15: +SQL> SELECT r.ROLENAME, ct.FIRST_NAME, ct.LAST_NAME, pl.DESCRIPTION FROM SUBSCRIPTION srp + 2 LEFT OUTER JOIN CONTACT ct ON srp.FK_CONTACT_ID = ct.CONTACT_ID + 3 LEFT OUTER JOIN PROFILE pf ON pf.FK_CONTACT_ID = ct.CONTACT_ID + 4 LEFT OUTER JOIN USERROLE ur ON ur.FK_PROFILE_ID = pf.PROFILE_ID + 5 LEFT OUTER JOIN ROLE r ON r.ROLE_ID = ur.FK_ROLE_ID + 6 LEFT OUTER JOIN PLAN pl ON srp.FK_PLAN_ID = pl.PLAN_ID; + +ROLENAME FIRST_NAME LAST_NAME DESCRIPTION +---------------- ---------------- ---------------- -------------------------------- +CUSTOMER Bob Smith Spring Gala Preview +CUSTOMER Bob Smith Summer Exhibit Plus +CUSTOMER Bob Smith Fall Exhibition Weekend +CUSTOMER David Brown Spring Gala Standard +CUSTOMER David Brown Summer Exhibit Premium +CUSTOMER David Brown Annual Patron Pass +CUSTOMER Emma Davis Spring Gala VIP +CUSTOMER Emma Davis Fall Exhibition Access +CUSTOMER Frank Wilson Summer Exhibit Basic +CUSTOMER Frank Wilson Fall Exhibition Full Day + +10 rows selected. + +SQL> +SQL> -- Q16: +SQL> SELECT ct.FIRST_NAME, ct.LAST_NAME, adr.STREET, z.CITY, z.STATE, z.ZIP + 2 FROM ADDRESS adr + 3 LEFT OUTER JOIN CONTACT ct ON adr.FK_CONTACT_ID = ct.CONTACT_ID + 4 LEFT OUTER JOIN ZIP z ON adr.ZIP = z.ZIP; + +FIRST_NAME LAST_NAME STREET CITY ST ZIP +---------------- ---------------- -------------------------------- ---------------- -- ----- +ART SYSTEM 789 Oak St, suite 10 Atherton CA 94027 +Alice Johnson 789 Oak St, suite 15 Atherton CA 94027 +Karen Park 789 Oak St, suite 1 Atherton CA 94027 +Jeese Taylor 789 Oak St, suite 5 Atherton CA 94027 +James Lee 789 Oak St, suite 15 Atherton CA 94027 +Stephen Alec 890 Venue Rd Beverly Hills CA 90210 +Henry Martinez 200 Sunset Blvd Beverly Hills CA 90210 +Carol White 100 Broadway New York NY 10001 +Bob Smith 300 Michigan Ave Chicago IL 60601 +David Brown 400 Main St Houston TX 77001 +Emma Davis 500 Central Ave Phoenix AZ 85001 +Frank Wilson 600 Pike St Seattle WA 98101 + +12 rows selected. + +SQL> +SQL> -- Q17: +SQL> SELECT COALESCE(vws.ROLENAME, vwsp.ROLENAME, vwc.ROLENAME, vwsys.ROLENAME) AS ROLENAME, + 2 COALESCE(vws.ACTIVE, vwsp.ACTIVE, vwc.ACTIVE, vwsys.ACTIVE) AS ACTIVE, + 3 ct.FIRST_NAME, ct.LAST_NAME, adr.STREET, z.CITY, z.STATE, z.ZIP + 4 FROM ADDRESS adr + 5 LEFT OUTER JOIN CONTACT ct ON adr.FK_CONTACT_ID = ct.CONTACT_ID + 6 LEFT OUTER JOIN ZIP z ON adr.ZIP = z.ZIP + 7 LEFT OUTER JOIN VIEW_STAFF vws ON vws.FK_CONTACT_ID = ct.CONTACT_ID + 8 LEFT OUTER JOIN VIEW_SUPPLIER vwsp ON vwsp.FK_CONTACT_ID = ct.CONTACT_ID + 9 LEFT OUTER JOIN VIEW_CUSTOMER vwc ON vwc.FK_CONTACT_ID = ct.CONTACT_ID + 10 LEFT OUTER JOIN VIEW_SYSTEMROLE vwsys ON vwsys.FK_CONTACT_ID = ct.CONTACT_ID; + +ROLENAME ACTIV FIRST_NAME LAST_NAME STREET CITY ST ZIP +---------------- ----- ---------------- ---------------- -------------------------------- ---------------- -- ----- +CUSTOMER false Carol White 100 Broadway New York NY 10001 +CUSTOMER true Bob Smith 300 Michigan Ave Chicago IL 60601 +CUSTOMER true David Brown 400 Main St Houston TX 77001 +CUSTOMER true Emma Davis 500 Central Ave Phoenix AZ 85001 +CUSTOMER true Frank Wilson 600 Pike St Seattle WA 98101 +SUPPLIER true Stephen Alec 890 Venue Rd Beverly Hills CA 90210 +SUPPLIER true Henry Martinez 200 Sunset Blvd Beverly Hills CA 90210 +SYSTEM true ART SYSTEM 789 Oak St, suite 10 Atherton CA 94027 +STAFF true Alice Johnson 789 Oak St, suite 15 Atherton CA 94027 +STAFF true Jeese Taylor 789 Oak St, suite 5 Atherton CA 94027 +STAFF true James Lee 789 Oak St, suite 15 Atherton CA 94027 +STAFF true Karen Park 789 Oak St, suite 1 Atherton CA 94027 + +12 rows selected. + +SQL> +SQL> -- Q18: Verify rows in tables +SQL> SELECT 'CONTACT' AS TABLE_NAME, COUNT(*) AS ROW_COUNT FROM CONTACT UNION ALL + 2 SELECT 'ZIP', COUNT(*) FROM ZIP UNION ALL + 3 SELECT 'ADDRESS', COUNT(*) FROM ADDRESS UNION ALL + 4 SELECT 'ROLE', COUNT(*) FROM ROLE UNION ALL + 5 SELECT 'PROFILE', COUNT(*) FROM PROFILE UNION ALL + 6 SELECT 'USERROLE', COUNT(*) FROM USERROLE UNION ALL + 7 SELECT 'STAFF', COUNT(*) FROM STAFF UNION ALL + 8 SELECT 'DOCUMENT', COUNT(*) FROM DOCUMENT UNION ALL + 9 SELECT 'AUTHORIZATION', COUNT(*) FROM AUTHORIZATION UNION ALL + 10 SELECT 'PLAN', COUNT(*) FROM PLAN UNION ALL + 11 SELECT 'INVENTORY', COUNT(*) FROM INVENTORY UNION ALL + 12 SELECT 'EXHIBIT', COUNT(*) FROM EXHIBIT UNION ALL + 13 SELECT 'ORDER_ITEMS', COUNT(*) FROM ORDER_ITEMS UNION ALL + 14 SELECT 'INVOICE', COUNT(*) FROM INVOICE UNION ALL + 15 SELECT 'SUBSCRIPTION', COUNT(*) FROM SUBSCRIPTION UNION ALL + 16 SELECT 'TASK_HISTORY', COUNT(*) FROM TASK_HISTORY + 17 ORDER BY TABLE_NAME; + +TABLE_NAME ROW_COUNT +------------- ---------- +ADDRESS 12 +AUTHORIZATION 9 +CONTACT 12 +DOCUMENT 10 +EXHIBIT 10 +INVENTORY 10 +INVOICE 10 +ORDER_ITEMS 0 +PLAN 10 +PROFILE 12 +ROLE 4 +STAFF 4 +SUBSCRIPTION 10 +TASK_HISTORY 0 +USERROLE 12 +ZIP 10 + +16 rows selected. + +SQL> +SQL> -- Q19: rough check uniqueness: across tables columns +SQL> SELECT RPAD(idx.TABLE_NAME,15,' '), COUNT( col.column_name ), COUNT( col.TABLE_NAME ) + 2 FROM user_indexes idx + 3 JOIN user_ind_columns col ON ( col.index_name = idx.index_name ) + 4 WHERE idx.uniqueness = 'UNIQUE' + 5 GROUP BY idx.TABLE_NAME; + +RPAD(IDX.TABLE_ COUNT(COL.COLUMN_NAME) COUNT(COL.TABLE_NAME) +--------------- ---------------------- --------------------- +CONTACT 1 1 +ZIP 1 1 +ADDRESS 2 2 +ROLE 1 1 +PROFILE 1 1 +USERROLE 2 2 +STAFF 1 1 +DOCUMENT 1 1 +PLAN 1 1 +SUBSCRIPTION 2 2 +INVOICE 1 1 +AUTHORIZATION 1 1 +INVENTORY 3 3 +EXHIBIT 1 1 +ORDER_ITEMS 1 1 +TASK_HISTORY 1 1 + +16 rows selected. + +SQL> +SQL> -- Q20: Likely weak entity tables; +SQL> SELECT pk.table_name + 2 -- LISTAGG(pk.column_name, ', ') WITHIN GROUP (ORDER BY pk.position) AS primary_key_columns, + 3 -- LISTAGG(fk.column_name, ', ') WITHIN GROUP (ORDER BY fk.position) AS foreign_key_columns + 4 FROM all_cons_columns pk + 5 JOIN all_constraints pkc + 6 ON pk.constraint_name = pkc.constraint_name + 7 AND pk.owner = pkc.owner + 8 JOIN all_cons_columns fk + 9 ON pk.table_name = fk.table_name + 10 AND pk.owner = fk.owner + 11 JOIN all_constraints fkc + 12 ON fk.constraint_name = fkc.constraint_name + 13 AND fk.owner = fkc.owner + 14 WHERE pkc.constraint_type = 'P' -- Primary key + 15 AND fkc.constraint_type = 'R' -- Foreign key + 16 AND pk.column_name = fk.column_name -- PK column is also FK column + 17 AND pk.owner = USER + 18 GROUP BY pk.table_name + 19 ORDER BY pk.table_name; + +TABLE_NAME +-------------------------------------------------------------------------------------------------------------------------------- +ADDRESS +STAFF +SUBSCRIPTION +USERROLE + +SQL> -- CREATE SCHEMA +SQL> +SQL> /