update schema to cover postgresql.

This commit is contained in:
2026-03-28 21:10:30 -04:00
parent 9bffb572c3
commit ed98941725
6 changed files with 706 additions and 2134 deletions

View File

@@ -1,565 +0,0 @@
-- 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

View File

@@ -1,435 +0,0 @@
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> /

388
schema/schema_art_DDL.sql Executable file
View File

@@ -0,0 +1,388 @@
-- CREATE SCHEMA
/*
-- DROP SCHEMA art CASCADE;
CREATE SCHEMA art AUTHORIZATION sherwinp;
*/
-- POSTGRESQL SQL SCHEMA DDL: art
SET search_path TO art;
-- art."document" definition
-- Drop table
-- DROP TABLE "document";
CREATE TABLE "document" (
document_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
document_url varchar(254) NOT NULL,
CONSTRAINT pk_document PRIMARY KEY (document_id)
);
-- art.zip definition
-- Drop table
-- DROP TABLE zip;
CREATE TABLE zip (
zip varchar(5) NOT NULL,
city varchar(16) NULL,
state varchar(2) NULL,
CONSTRAINT pk_zip PRIMARY KEY (zip),
CONSTRAINT zip_check CHECK (regexp_like((zip)::text, '\d{5}'::text))
);
-- art.contact definition
-- Drop table
-- DROP TABLE contact;
CREATE TABLE contact (
contact_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
first_name varchar(16) NOT NULL,
last_name varchar(16) NOT NULL,
phone_no varchar(12) NULL,
email varchar(64) NOT NULL,
modified_by int4 NULL,
created_dt timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,
modified_dt timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,
CONSTRAINT pk_contact_id PRIMARY KEY (contact_id),
CONSTRAINT contact_modified_by_fkey FOREIGN KEY (modified_by) REFERENCES contact(contact_id)
);
-- art."plan" definition
-- Drop table
-- DROP TABLE "plan";
CREATE TABLE "plan" (
plan_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
description varchar(32) NULL,
fk_document_id int4 NOT NULL,
duration int4 NULL,
price int4 NULL,
modified_by int4 NULL,
created_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
modified_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
CONSTRAINT pk_plan PRIMARY KEY (plan_id),
CONSTRAINT plan_fk_document_id_fkey FOREIGN KEY (fk_document_id) REFERENCES "document"(document_id)
);
-- art.profile definition
-- Drop table
-- DROP TABLE profile;
CREATE TABLE profile (
profile_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
fk_contact_id int4 NOT NULL,
active bool DEFAULT false NULL,
modified_by int4 NOT NULL,
created_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
modified_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
CONSTRAINT pk_profile_id PRIMARY KEY (profile_id),
CONSTRAINT profile_fk_contact_id_fkey FOREIGN KEY (fk_contact_id) REFERENCES contact(contact_id) ON DELETE CASCADE,
CONSTRAINT profile_modified_by_fkey FOREIGN KEY (modified_by) REFERENCES profile(profile_id)
);
-- art.staff definition
-- Drop table
-- DROP TABLE staff;
CREATE TABLE staff (
fk_profile_id int4 NOT NULL,
"position" varchar(14) NOT NULL,
CONSTRAINT check_position CHECK ((("position")::text = ANY ((ARRAY['Director'::character varying, 'Curator'::character varying, 'Art Handler'::character varying, 'Registrar'::character varying, 'Associate'::character varying])::text[]))),
CONSTRAINT pk_staff PRIMARY KEY (fk_profile_id),
CONSTRAINT staff_fk_profile_id_fkey FOREIGN KEY (fk_profile_id) REFERENCES profile(profile_id)
);
-- art."subscription" definition
-- Drop table
-- DROP TABLE "subscription";
CREATE TABLE "subscription" (
fk_plan_id int4 NOT NULL,
fk_contact_id int4 NOT NULL,
modified_by int4 NULL,
created_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
modified_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
CONSTRAINT pk_subscription PRIMARY KEY (fk_plan_id, fk_contact_id),
CONSTRAINT subscription_fk_contact_id_fkey FOREIGN KEY (fk_contact_id) REFERENCES contact(contact_id),
CONSTRAINT subscription_fk_plan_id_fkey FOREIGN KEY (fk_plan_id) REFERENCES "plan"(plan_id)
);
-- art.task_history definition
-- Drop table
-- DROP TABLE task_history;
CREATE TABLE task_history (
task_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
assigned_to_profile_id int4 NOT NULL,
created_by_profile_id int4 NOT NULL,
related_entity_type varchar(32) NULL,
related_entity_id int4 NULL,
task_type varchar(32) NOT NULL,
task_title varchar(64) NOT NULL,
description varchar(128) NULL,
fk_document_id int4 NULL,
status varchar(16) DEFAULT 'pending'::character varying NULL,
due_date timestamp NULL,
completed_at timestamp NULL,
created_at timestamp DEFAULT CURRENT_TIMESTAMP NULL,
updated_at timestamp DEFAULT CURRENT_TIMESTAMP NULL,
CONSTRAINT chk_status CHECK (((status)::text = ANY ((ARRAY['pending'::character varying, 'in_progress'::character varying, 'completed'::character varying, 'cancelled'::character varying])::text[]))),
CONSTRAINT task_history_pkey PRIMARY KEY (task_id),
CONSTRAINT task_history_fk_document_id_fkey FOREIGN KEY (fk_document_id) REFERENCES "document"(document_id)
);
-- art.userrole definition
-- Drop table
-- DROP TABLE userrole;
CREATE TABLE userrole (
fk_profile_id int4 NOT NULL,
rolename varchar(16) NULL,
passwordhash varchar(256) DEFAULT NULL::character varying NULL,
CONSTRAINT check_role CHECK (((rolename)::text = ANY ((ARRAY['SYSTEM'::character varying, 'CONTACT'::character varying, 'CUSTOMER'::character varying, 'STAFF'::character varying, 'SUPPLIER'::character varying])::text[]))),
CONSTRAINT pk_userrole PRIMARY KEY (fk_profile_id),
CONSTRAINT userrole_fk_profile_id_fkey FOREIGN KEY (fk_profile_id) REFERENCES profile(profile_id) ON DELETE CASCADE
);
-- art.address definition
-- Drop table
-- DROP TABLE address;
CREATE TABLE address (
zip varchar(5) NOT NULL,
fk_contact_id int4 NOT NULL,
street varchar(32) NOT NULL,
CONSTRAINT pk_address PRIMARY KEY (zip, fk_contact_id),
CONSTRAINT address_fk_contact_id_fkey FOREIGN KEY (fk_contact_id) REFERENCES contact(contact_id) ON DELETE CASCADE,
CONSTRAINT address_zip_fkey FOREIGN KEY (zip) REFERENCES zip(zip)
);
-- art.authorize definition
-- Drop table
-- DROP TABLE authorize;
CREATE TABLE authorize (
authorization_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
fk_contact_id int4 NULL,
authorization_status varchar(16) NOT NULL,
authorization_date timestamp DEFAULT CURRENT_TIMESTAMP NULL,
expiration_date timestamp DEFAULT CURRENT_TIMESTAMP NULL,
fk_document_id int4 NULL,
modified_by int4 NULL,
created_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
modified_dt timestamp DEFAULT CURRENT_TIMESTAMP NULL,
CONSTRAINT authorize_pkey PRIMARY KEY (authorization_id),
CONSTRAINT check_authorization_status CHECK (((authorization_status)::text = ANY ((ARRAY['pending'::character varying, 'approved'::character varying, 'rejected'::character varying, 'expired'::character varying])::text[]))),
CONSTRAINT authorize_fk_contact_id_fkey FOREIGN KEY (fk_contact_id) REFERENCES contact(contact_id),
CONSTRAINT authorize_fk_document_id_fkey FOREIGN KEY (fk_document_id) REFERENCES "document"(document_id)
);
-- art.inventory definition
-- Drop table
-- DROP TABLE inventory;
CREATE TABLE inventory (
inventory_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
fk_contact_id int4 NOT NULL,
fk_authorization_id int4 NULL,
sku varchar(100) NOT NULL,
product_description varchar(100) NOT NULL,
unit_cost numeric(10, 2) NOT NULL,
lead_time_days int4 NOT NULL,
product_name varchar(100) NOT NULL,
unit_of_measure varchar(50) NOT NULL,
base_price numeric(10, 2) NOT NULL,
quantity_available int4 DEFAULT 0 NOT NULL,
created_at timestamp DEFAULT CURRENT_TIMESTAMP NULL,
updated_at timestamp DEFAULT CURRENT_TIMESTAMP NULL,
fk_document_id int4 NULL,
CONSTRAINT inventory_pkey PRIMARY KEY (inventory_id),
CONSTRAINT supplier_unique_sku UNIQUE (fk_contact_id, sku),
CONSTRAINT inventory_fk_authorization_id_fkey FOREIGN KEY (fk_authorization_id) REFERENCES authorize(authorization_id),
CONSTRAINT inventory_fk_contact_id_fkey FOREIGN KEY (fk_contact_id) REFERENCES contact(contact_id),
CONSTRAINT inventory_fk_document_id_fkey FOREIGN KEY (fk_document_id) REFERENCES "document"(document_id)
);
-- art.invoice definition
-- Drop table
-- DROP TABLE invoice;
CREATE TABLE invoice (
invoice_id uuid DEFAULT gen_random_uuid() NOT NULL,
fk_plan_id int4 NULL,
fk_contact_id int4 NULL,
invoicedate date NULL,
amountpaid numeric(10, 2) DEFAULT 0 NULL,
CONSTRAINT invoice_pkey PRIMARY KEY (invoice_id),
CONSTRAINT invoice_fk_contact_id_fkey FOREIGN KEY (fk_contact_id) REFERENCES contact(contact_id),
CONSTRAINT invoice_fk_plan_id_fkey FOREIGN KEY (fk_plan_id) REFERENCES "plan"(plan_id)
);
-- art.order_items definition
-- Drop table
-- DROP TABLE order_items;
CREATE TABLE order_items (
order_item_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
fk_profile_id int4 NOT NULL,
transaction_id varchar(32) NULL,
created_at timestamp NOT NULL,
quantity int4 DEFAULT 1 NOT NULL,
unit_price numeric(10, 2) NOT NULL,
line_total numeric(10, 2) NOT NULL,
fk_inventory_id int4 NOT NULL,
CONSTRAINT order_items_pkey PRIMARY KEY (order_item_id),
CONSTRAINT order_items_fk_inventory_id_fkey FOREIGN KEY (fk_inventory_id) REFERENCES inventory(inventory_id),
CONSTRAINT order_items_fk_profile_id_fkey FOREIGN KEY (fk_profile_id) REFERENCES profile(profile_id)
);
-- art.exhibit definition
-- Drop table
-- DROP TABLE exhibit;
CREATE TABLE exhibit (
exhibit_id int4 GENERATED ALWAYS AS IDENTITY NOT NULL,
fk_inventory_id int4 NOT NULL,
fk_plan_id int4 NULL,
CONSTRAINT exhibit_pkey PRIMARY KEY (exhibit_id),
CONSTRAINT exhibit_fk_inventory_id_fkey FOREIGN KEY (fk_inventory_id) REFERENCES inventory(inventory_id),
CONSTRAINT exhibit_fk_plan_id_fkey FOREIGN KEY (fk_plan_id) REFERENCES "plan"(plan_id)
);
/* VIEW of available exhibit inventory */
CREATE OR REPLACE VIEW view_available_inventory
AS SELECT inventory.inventory_id,
inventory.fk_contact_id,
inventory.fk_authorization_id,
inventory.sku,
inventory.product_description,
inventory.unit_cost,
inventory.lead_time_days,
inventory.product_name,
inventory.unit_of_measure,
inventory.base_price,
inventory.quantity_available,
inventory.created_at,
inventory.updated_at,
inventory.fk_document_id
FROM art.inventory
WHERE inventory.quantity_available > 0
INTERSECT
SELECT exhibit.fk_inventory_id AS inventory_id,
NULL::integer AS fk_contact_id,
NULL::integer AS fk_authorization_id,
NULL::character varying AS sku,
NULL::character varying AS product_description,
NULL::numeric AS unit_cost,
NULL::integer AS lead_time_days,
NULL::character varying AS product_name,
NULL::character varying AS unit_of_measure,
NULL::numeric AS base_price,
NULL::integer AS quantity_available,
NULL::timestamp without time zone AS created_at,
NULL::timestamp without time zone AS updated_at,
NULL::integer AS fk_document_id
FROM art.exhibit;
CREATE OR REPLACE VIEW VIEW_SYSTEMROLE AS
SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, u.ROLENAME, p.ACTIVE FROM
USERROLE u
JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID AND u.ROLENAME = 'SYSTEM';
CREATE OR REPLACE VIEW VIEW_STAFF AS
SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, u.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 AND u.ROLENAME = 'STAFF'
JOIN CONTACT c ON c.CONTACT_ID = p.FK_CONTACT_ID
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, u.ROLENAME, p.ACTIVE, c.FIRST_NAME, c.LAST_NAME FROM
USERROLE u
JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID AND u.ROLENAME = 'SUPPLIER'
JOIN CONTACT c ON c.CONTACT_ID = p.FK_CONTACT_ID;
CREATE OR REPLACE VIEW VIEW_CUSTOMER AS
SELECT u.FK_PROFILE_ID, p.FK_CONTACT_ID, u.ROLENAME, p.ACTIVE, c.FIRST_NAME, c.LAST_NAME FROM
USERROLE u
JOIN PROFILE p ON p.PROFILE_ID=u.FK_PROFILE_ID AND u.ROLENAME = 'CUSTOMER'
JOIN CONTACT c ON c.CONTACT_ID = p.FK_CONTACT_ID;
-- Trigger Function Paid Invoice, generates subscription
CREATE OR REPLACE FUNCTION invoice_paid_subscription()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
INSERT INTO SUBSCRIPTION (FK_PLAN_ID, FK_CONTACT_ID) VALUES (NEW.FK_PLAN_ID, NEW.FK_CONTACT_ID);
RETURN NEW;
END;
$function$
;
-- Trigger on invoice
create trigger paid_subscription after
insert
on invoice for each row
execute function invoice_paid_subscription();
CREATE OR REPLACE FUNCTION ORDER_ITEMS_reserved()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
UPDATE INVENTORY SET QUANTITY_AVAILABLE = QUANTITY_AVAILABLE - NEW.QUANTITY WHERE INVENTORY_ID= NEW.FK_INVENTORY_ID;
RETURN NEW;
END;
$function$
;
-- Trigger on ORDER_ITEMS customer ordered items reservation
CREATE TRIGGER ORDER_ITEMS_reserved AFTER
INSERT
ON ORDER_ITEMS FOR EACH ROW
execute function ORDER_ITEMS_reserved();

View File

@@ -1,12 +1,10 @@
-- ORACLE SQL DML: SCHEMA C##ART
SET ECHO ON;
SET SERVEROUTPUT ON;
SET PAGESIZE 30;
SET HEADING ON;
-- SQL DML: SCHEMA C##ART
SET search_path TO art;
BEGIN;
-- 20 Queries
-- Q1: Select all columns and all rows from one table
SELECT * FROM ROLE;
SELECT * FROM USERROLE;
-- Q2: Select five columns and all rows from one table
SELECT CONTACT_ID, FIRST_NAME, LAST_NAME, PHONE_NO, EMAIL FROM CONTACT;
@@ -25,8 +23,8 @@ SELECT * FROM ZIP ORDER BY 1;
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
JOIN authorize au ON au.AUTHORIZATION_ID = iv.FK_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
@@ -34,28 +32,28 @@ SELECT DISTINCT iv.SKU, iv.PRODUCT_NAME,iv.BASE_PRICE,iv.LEAD_TIME_DAYS, iv.QUAN
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 AUTHORIZE au ON au.AUTHORIZATION_ID = iv.FK_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 AUTHORIZE au ON au.AUTHORIZATION_ID = iv.FK_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);
SELECT * FROM PROFILE pf JOIN USERROLE ur ON pf.PROFILE_ID = ur.FK_PROFILE_ID;
-- Q10: Select length of one column from one table (use LENGTH function)
SELECT LENGTH(ROLENAME) FROM ROLE;
SELECT LENGTH(ROLENAME) FROM USERROLE;
-- 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);
SELECT * FROM PROFILE pf JOIN USERROLE ur ON pf.PROFILE_ID = ur.FK_PROFILE_ID;
DELETE FROM USERROLE WHERE FK_PROFILE_ID=3;
SELECT * FROM PROFILE pf JOIN USERROLE ur ON pf.PROFILE_ID = ur.FK_PROFILE_ID;
ROLLBACK TO SAVEPOINT sp1;
@@ -73,15 +71,14 @@ 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;
LEFT OUTER JOIN AUTHORIZE aut ON aut.FK_CONTACT_ID = vsu.FK_CONTACT_ID
WHERE aut.AUTHORIZATION_STATUS='approved' AND aut.EXPIRATION_DATE > CURRENT_TIMESTAMP + INTERVAL '30 days';
-- Q15:
SELECT r.ROLENAME, ct.FIRST_NAME, ct.LAST_NAME, pl.DESCRIPTION FROM SUBSCRIPTION srp
SELECT ur.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:
@@ -106,12 +103,11 @@ LEFT OUTER JOIN VIEW_SYSTEMROLE vwsys ON vwsys.FK_CONTACT_ID = ct.CONTACT_ID;
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 'AUTHORIZE', COUNT(*) FROM AUTHORIZE UNION ALL
SELECT 'PLAN', COUNT(*) FROM PLAN UNION ALL
SELECT 'INVENTORY', COUNT(*) FROM INVENTORY UNION ALL
SELECT 'EXHIBIT', COUNT(*) FROM EXHIBIT UNION ALL
@@ -122,31 +118,43 @@ 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;
-- Q19: Unique index column counts per table
-- Oracle: user_indexes + user_ind_columns
-- PG equivalent: pg_indexes (basic) or pg_index + pg_class + pg_attribute
SELECT
t.relname AS table_name,
COUNT(DISTINCT i.indexrelid) AS unique_index_count,
COUNT(a.attname) AS unique_column_count
FROM pg_index i
JOIN pg_class t ON t.oid = i.indrelid
JOIN pg_class ix ON ix.oid = i.indexrelid
JOIN pg_attribute a ON a.attrelid = t.oid
AND a.attnum = ANY(i.indkey)
WHERE i.indisunique = TRUE
AND t.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())
GROUP BY t.relname
ORDER BY t.relname;
-- 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
-- Q20: Likely weak entity tables — tables where a PK column is also an FK column
-- Oracle: all_cons_columns + all_constraints filtered to USER
-- PG equivalent: information_schema tables
SELECT tc.table_name
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu_pk
ON kcu_pk.constraint_name = tc.constraint_name
AND kcu_pk.table_schema = tc.table_schema
JOIN information_schema.key_column_usage kcu_fk
ON kcu_fk.table_name = tc.table_name
AND kcu_fk.column_name = kcu_pk.column_name
AND kcu_fk.table_schema= tc.table_schema
JOIN information_schema.table_constraints fkc
ON fkc.constraint_name = kcu_fk.constraint_name
AND fkc.table_schema = kcu_fk.table_schema
WHERE tc.constraint_type = 'PRIMARY KEY'
AND fkc.constraint_type = 'FOREIGN KEY'
AND tc.table_schema = current_schema()
GROUP BY tc.table_name
ORDER BY tc.table_name;
COMMIT;
/

View File

@@ -0,0 +1,263 @@
SET search_path TO art;
-- 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 (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (4, TRUE, 1);
INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (5, TRUE, 1);
INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (6, TRUE, 1);
INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (7, TRUE, 1);
INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (8, FALSE, 1); -- inactive
INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (9, TRUE, 1);
INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (10, TRUE, 1);
INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (11, TRUE, 1);
INSERT INTO PROFILE (FK_CONTACT_ID, ACTIVE, MODIFIED_BY) VALUES (12, TRUE, 1);
INSERT INTO USERROLE (FK_PROFILE_ID, ROLENAME, PASSWORDHASH) VALUES (1, 'SYSTEM', NULL);
INSERT INTO USERROLE (FK_PROFILE_ID, ROLENAME) VALUES (2, 'STAFF');
INSERT INTO USERROLE (FK_PROFILE_ID, ROLENAME) VALUES (3, 'STAFF');
INSERT INTO USERROLE (FK_PROFILE_ID, ROLENAME) VALUES (4, 'STAFF');
INSERT INTO USERROLE (FK_PROFILE_ID, ROLENAME) VALUES (5, 'STAFF');
INSERT INTO USERROLE (FK_PROFILE_ID, ROLENAME) VALUES (6, 'SUPPLIER');
INSERT INTO USERROLE (FK_PROFILE_ID, ROLENAME) VALUES (7, 'SUPPLIER');
INSERT INTO USERROLE (FK_PROFILE_ID, ROLENAME) VALUES (8, 'CUSTOMER'); -- inactive customer
INSERT INTO USERROLE (FK_PROFILE_ID, ROLENAME) VALUES (9, 'CUSTOMER');
INSERT INTO USERROLE (FK_PROFILE_ID, ROLENAME) VALUES (10, 'CUSTOMER');
INSERT INTO USERROLE (FK_PROFILE_ID, ROLENAME) VALUES (11, 'CUSTOMER');
INSERT INTO USERROLE (FK_PROFILE_ID, ROLENAME) VALUES (12, 'CUSTOMER');
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_URL) VALUES ('https://art.com/docs/helpdoc.pdf'); --DOC ID 1
INSERT INTO DOCUMENT (DOCUMENT_URL) VALUES ('https://art.com/docs/consignment-stephen-crimson-horizon.pdf'); --DOC ID 2
INSERT INTO DOCUMENT (DOCUMENT_URL) VALUES ('https://art.com/docs/consignment-stephen-misty-valley.pdf'); --DOC ID 3
INSERT INTO DOCUMENT (DOCUMENT_URL) VALUES ('https://art.com/docs/consignment-stephen-twisted-form.pdf'); --DOC ID 4
INSERT INTO DOCUMENT (DOCUMENT_URL) VALUES ('https://art.com/docs/consignment-stephen-blue-symmetry.pdf'); --DOC ID 5
INSERT INTO DOCUMENT (DOCUMENT_URL) VALUES ('https://art.com/docs/consignment-henry-urban-solitude.pdf'); --DOC ID 6
INSERT INTO DOCUMENT (DOCUMENT_URL) VALUES ('https://art.com/docs/consignment-henry-earth-vessel.pdf'); --DOC ID 7
INSERT INTO DOCUMENT (DOCUMENT_URL) VALUES ('https://art.com/docs/consignment-henry-quiet-reflection.pdf'); --DOC ID 8
-- Stephen — approved
INSERT INTO AUTHORIZE (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE)
VALUES ('approved', 6, 2, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + INTERVAL '1 year');
-- Stephen — approved
INSERT INTO AUTHORIZE (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE)
VALUES ('approved', 6, 3, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + INTERVAL '1 year');
-- Stephen — pending ('pending' status path)
INSERT INTO AUTHORIZE (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE)
VALUES ('pending', 6, 4, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + INTERVAL '1 year');
-- Stephen — rejected ('rejected' status path)
INSERT INTO AUTHORIZE (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE)
VALUES ('rejected', 6, 5, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + INTERVAL '30 days');
-- Henry — approved
INSERT INTO AUTHORIZE (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE)
VALUES ('approved', 7, 6, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + INTERVAL '1 year');
-- Henry — approved
INSERT INTO AUTHORIZE (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE)
VALUES ('approved', 7, 7, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + INTERVAL '1 year');
-- Henry — approved
INSERT INTO AUTHORIZE (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE)
VALUES ('approved', 7, 8, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + INTERVAL '1 year');
-- Henry — pending
INSERT INTO AUTHORIZE (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE)
VALUES ('pending', 7, 7, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + INTERVAL '180 days');
-- Henry — expired (EXPIRATION_DATE in the past)
INSERT INTO AUTHORIZE (AUTHORIZATION_STATUS, FK_CONTACT_ID, FK_DOCUMENT_ID, MODIFIED_BY, AUTHORIZATION_DATE, EXPIRATION_DATE)
VALUES ('expired', 7, 8, 1, CURRENT_TIMESTAMP - INTERVAL '365 days', CURRENT_TIMESTAMP - INTERVAL '30 days');
-- PLAN Documents for exhibition
INSERT INTO DOCUMENT (DOCUMENT_URL) VALUES ('https://art.com/docs/plan-spring-gala-2025.pdf'); -- DOC ID 9
INSERT INTO DOCUMENT (DOCUMENT_URL) VALUES ('https://art.com/docs/plan-summer-exhibit-2025.pdf'); -- DOC ID 10
INSERT INTO DOCUMENT (DOCUMENT_URL) VALUES ('https://art.com/docs/plan-fall-exhibition-2025.pdf'); -- DOC ID 11
-- 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, FK_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, FK_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, FK_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, FK_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, FK_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, FK_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, FK_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, FK_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, FK_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, FK_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
INSERT INTO ORDER_ITEMS (FK_PROFILE_ID, TRANSACTION_ID, CREATED_AT, QUANTITY, UNIT_PRICE, LINE_TOTAL, FK_INVENTORY_ID)
VALUES (9, 'TXN-2025-0001', TIMESTAMP'2025-02-01 10:00:00', 2, 1200.00, 1200.00, 1); -- Bob → Crimson Horizon
INSERT INTO ORDER_ITEMS (FK_PROFILE_ID, TRANSACTION_ID, CREATED_AT, QUANTITY, UNIT_PRICE, LINE_TOTAL, FK_INVENTORY_ID)
VALUES (11, 'TXN-2025-0002', TIMESTAMP'2025-02-03 11:30:00', 1, 700.00, 700.00, 2); -- David → Misty Valley
INSERT INTO TASK_HISTORY (ASSIGNED_TO_PROFILE_ID, CREATED_BY_PROFILE_ID, RELATED_ENTITY_TYPE, RELATED_ENTITY_ID,
TASK_TYPE, TASK_TITLE, DESCRIPTION, FK_DOCUMENT_ID, STATUS, DUE_DATE)
VALUES (5, 2, 'order', 2, 'logistics', 'Ship Misty Valley', 'Coordinate pickup from Stephen', 19, 'completed', TIMESTAMP'2025-02-15 17:00:00');
INSERT INTO TASK_HISTORY (ASSIGNED_TO_PROFILE_ID, CREATED_BY_PROFILE_ID, RELATED_ENTITY_TYPE, RELATED_ENTITY_ID,
TASK_TYPE, TASK_TITLE, DESCRIPTION, FK_DOCUMENT_ID, STATUS, DUE_DATE)
VALUES (4, 2, 'supplier', 18, 'review', 'Review Yuki consignment docs', 'Check Shibori Veil paperwork', 20, 'completed', TIMESTAMP'2025-03-01 12:00:00');
INSERT INTO TASK_HISTORY (ASSIGNED_TO_PROFILE_ID, CREATED_BY_PROFILE_ID, RELATED_ENTITY_TYPE, RELATED_ENTITY_ID,
TASK_TYPE, TASK_TITLE, DESCRIPTION, FK_DOCUMENT_ID, STATUS, DUE_DATE)
VALUES (4, 2, 'supplier', 19, 'review', 'Review Diego consignment', 'Evaluate Golden Mesa submission', 20, 'in_progress', TIMESTAMP'2025-04-01 12:00:00');
INSERT INTO TASK_HISTORY (ASSIGNED_TO_PROFILE_ID, CREATED_BY_PROFILE_ID, RELATED_ENTITY_TYPE, RELATED_ENTITY_ID,
TASK_TYPE, TASK_TITLE, DESCRIPTION, FK_DOCUMENT_ID, STATUS, DUE_DATE)
VALUES (21, 3, 'order', 5, 'display', 'Install Fall exhibit displays', 'Set up Neon Dreams and Kente Weave', 21, 'in_progress', TIMESTAMP'2025-09-15 09:00:00');
INSERT INTO TASK_HISTORY (ASSIGNED_TO_PROFILE_ID, CREATED_BY_PROFILE_ID, RELATED_ENTITY_TYPE, RELATED_ENTITY_ID,
TASK_TYPE, TASK_TITLE, DESCRIPTION, FK_DOCUMENT_ID, STATUS, DUE_DATE)
VALUES (22, 2, 'supplier', 20, 'review', 'Review Amara rhythm prints', 'Confirm limited edition certificates', 20, 'pending', TIMESTAMP'2025-04-10 17:00:00');
COMMIT;