This commit is contained in:
2026-03-28 09:51:56 -04:00
commit 9bffb572c3
4 changed files with 2239 additions and 0 deletions

565
schema/Price_Sherwin_DDL.sql Executable file
View File

@@ -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
/

File diff suppressed because it is too large Load Diff

152
schema/Price_Sherwin_DML.sql Executable file
View File

@@ -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
/

View File

@@ -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> /