SQL Scripts to Create ACME Database Objects

SQL Scripts to Create ACME Database Objects

These statements create ACME database in DB2:

-- 
-- TABLE: ADDRESS 
--
   
CREATE TABLE ADDRESS(
    ADDR_ID_N           INTEGER          NOT NULL,
    ADDR_CUSTID_FN      INTEGER,
    ADDR_SALESMANID_FN  INTEGER, 
    ADDR_ADDRESS_S      VARCHAR(60),
    ADDR_TYPE_S         VARCHAR(8),
    ADDR_CITY_S         VARCHAR(18)      NOT NULL,
    ADDR_STATE_S        CHAR(2),
    ADDR_ZIP_S          VARCHAR(10)      NOT NULL,
    ADDR_COUNTRY_S      CHAR(3),
    CONSTRAINT CHK_ADDR_TYPE 
        CHECK (ADDR_TYPE_S IN ('BILLING', 'SHIPPING')),
        CONSTRAINT PK_ADDRPRIMARY PRIMARY KEY (ADDR_ID_N)
) 
;
   
-- 
-- TABLE: CUSTOMER 
--
   
CREATE TABLE CUSTOMER(
    CUST_ID_N             INTEGER          NOT NULL,
    CUST_PAYTERMSID_FN    INTEGER,
    CUST_SALESMANID_FN    INTEGER,
    CUST_STATUS_S         VARCHAR(1)       DEFAULT 'Y' NOT NULL,
    CUST_NAME_S           VARCHAR(50)      NOT NULL,
    CUST_ALIAS_S          VARCHAR(15),
    CUST_CREDHOLD_S       VARCHAR(1)       DEFAULT 'Y' NOT NULL,
    CONSTRAINT CHK_CUST_STATUS CHECK (CUST_STATUS_S IN ('N', 'Y')),
    CONSTRAINT CHK_CUST_CREDHOLD CHECK (CUST_CREDHOLD_S IN ('N', 'Y')),
    CONSTRAINT PK_CUSTPRIMARY PRIMARY KEY (CUST_ID_N)
) 
;
   
-- 
-- TABLE: ORDER_HEADER 
--
   
CREATE TABLE ORDER_HEADER(
    ORDHDR_ID_N                INTEGER          NOT NULL,
    ORDHDR_PAYTERMS_FN         INTEGER,
    ORDHDR_STATUSID_FN         INTEGER,
    ORDHDR_CUSTID_FN           INTEGER,
    ORDHDR_SALESMANID_FN       INTEGER,
    ORDHDR_NBR_S               VARCHAR(30)      NOT NULL,
    ORDHDR_INVOICENBR_N        INTEGER,
    ORDHDR_ORDERDATE_D         DATE,
    ORDHDR_INVOICEDATE_D       DATE,
    ORDHDR_CANCELDATE_D        DATE,
    ORDHDR_CREDITHOLD_S        CHAR(1),
    ORDHDR_READYTOINVOICE_S    CHAR(1)          DEFAULT 'N',
    ORDHDR_NOTES_S             VARCHAR(60),
    ORDHDR_CREATEDBY_S         VARCHAR(10),
    ORDHDR_CREATEDATE_D        DATE,
    CONSTRAINT CHK_ORDHDR_READY CHECK 
               (ORDHDR_READYTOINVOICE_S IN ('N', 'Y')),
    CONSTRAINT CHK_ORDHDR_CREDH CHECK (ORDHDR_CREDITHOLD_S IN ('N', 'Y')),
    CONSTRAINT PK_ORDHDRPRIM PRIMARY KEY (ORDHDR_ID_N),
    CONSTRAINT IDX_ORDHDR_ORDNBR  UNIQUE (ORDHDR_NBR_S)
) 
;
   
-- 
-- TABLE: ORDER_LINE 
--
   
CREATE TABLE ORDER_LINE(
    ORDLINE_ID_N            INTEGER          NOT NULL,
    ORDLINE_ORDHDRID_FN     INTEGER          NOT NULL,
    ORDLINE_PRODID_FN       INTEGER,
    ORDLINE_ORDQTY_N        INTEGER,
    ORDLINE_SHIPQTY_N       INTEGER,
    ORDLINE_CREATEDATE_D    DATE,
    ORDLINE_CREATEDBY_S     VARCHAR(10),
    CONSTRAINT PK_ORDLINEPRIM PRIMARY KEY (ORDLINE_ID_N)
) 
;
   
-- 
-- TABLE: ORDER_SHIPMENT 
--
   
CREATE TABLE ORDER_SHIPMENT(
    ORDSHIP_ORDHDR_ID_FN      INTEGER    NOT NULL,
    ORDSHIP_SHIPMENT_ID_FN    INTEGER    NOT NULL,
    CONSTRAINT PK_ORDHDRSHIP 
         PRIMARY KEY (ORDSHIP_ORDHDR_ID_FN,ORDSHIP_SHIPMENT_ID_FN)
) 
;
   
-- 
-- TABLE: PAYMENT_TERMS 
--
   
CREATE TABLE PAYMENT_TERMS(
    PAYTERMS_ID_N           INTEGER          NOT NULL,
    PAYTERMS_CODE_S         VARCHAR(6),
    PAYTERMS_DESC_S         VARCHAR(60),
    PAYTERMS_DISCPCT_N      DECIMAL(5,2),
    PAYTERMS_DAYSTOPAY_N    INTEGER,
    CONSTRAINT PK_PAYTERMS PRIMARY KEY (PAYTERMS_ID_N)
) 
;
   
-- 
-- TABLE: PHONE 
--
   
CREATE TABLE PHONE(
    PHONE_ID_N          INTEGER          NOT NULL,
    PHONE_CUSTID_FN     INTEGER,
    PHONE_SALESMANID_FN INTEGER, 
    PHONE_PHONENUM_S    VARCHAR(20),
    PHONE_TYPE_S        VARCHAR(20),
    CONSTRAINT CHK_PHONE_TYPE CHECK (PHONE_TYPE_S IN ('PHONE', 'FAX')),
    CONSTRAINT PK_PHONERIMARY PRIMARY KEY (PHONE_ID_N)
) 
;
   
-- 
-- TABLE: PRODUCT 
--
   
CREATE TABLE PRODUCT(
    PROD_ID_N             INTEGER          NOT NULL,
    PROD_PRICE_N          DECIMAL(10,2),
    PROD_NUM_S            VARCHAR(10),
    PROD_DESCRIPTION_S    VARCHAR(44)      NOT NULL,
    PROD_STATUS_S         CHAR(1)          DEFAULT 'Y',
    PROD_BRAND_S          VARCHAR(20)      NOT NULL,
    PROD_PLTWID_N         DECIMAL(5,2)     NOT NULL,
    PROD_PLTLEN_N         DECIMAL(5,2)     NOT NULL,
    PROD_NETWGHT_N        DECIMAL(10,3),
    PROD_SHIPWEIGHT_N     DECIMAL(10,3),
    CONSTRAINT CHK_PRODSTATUS CHECK (PROD_STATUS_S in ('N', 'Y')),
    CONSTRAINT PK_PRODUCTPRIM PRIMARY KEY (PROD_ID_N)
) 
;
   
-- 
-- TABLE: SALESMAN 
--
   
CREATE TABLE SALESMAN(
    SALESMAN_ID_N         INTEGER          NOT NULL,
    SALESMAN_CODE_S       VARCHAR(2)       NOT NULL,
    SALESMAN_NAME_S       VARCHAR(50)      NOT NULL,
    SALESMAN_STATUS_S     CHAR(1)          DEFAULT 'Y',
    CONSTRAINT CHK_SALESSTATUS CHECK (SALESMAN_STATUS_S in ('N', 'Y')),
    CONSTRAINT PK_SALESMANPRIM PRIMARY KEY (SALESMAN_ID_N)
) 
;
   
-- 
-- TABLE: SHIPMENT 
--
   
CREATE TABLE SHIPMENT(
    SHIPMENT_ID_N             INTEGER          NOT NULL,
    SHIPMENT_BOLNUM_S         VARCHAR(6),
    SHIPMENT_SHIPDATE_D       DATE,
    SHIPMENT_ARRIVDATE_D      DATE,
    SHIPMENT_TOTALCASES_N     INTEGER,
    SHIPMENT_TRAILERNBR_S     VARCHAR(12),
    SHIPMENT_SHPMNTFRGHT_N    DECIMAL(12,2),
    SHIPMENT_FRTTERMS_S       VARCHAR(3),
    SHIPMENT_CREATEDBY_S      VARCHAR(10),
    SHIPMENT_CREATEDATE_D     TIMESTAMP,
    CONSTRAINT CHK_SHIPFRTTERMS 
           CHECK (SHIPMENT_FRTTERMS_S IN ('COL', 'PPD')),
    CONSTRAINT PK_SHIPMENTRPRIM PRIMARY KEY (SHIPMENT_ID_N)
) 
;
   
-- 
-- TABLE: STATUS 
--
   
CREATE TABLE STATUS(
    STATUS_ID_N      INTEGER          NOT NULL,
    STATUS_CODE_S    CHAR(2),
    STATUS_DESC_S    VARCHAR(30),
    CONSTRAINT PK_STATUSPRIM PRIMARY KEY (STATUS_ID_N)
) 
;
   
-- 
-- TABLE: DISCOUNT
--
   
CREATE TABLE DISCOUNT(
    DISC_MINAMOUNT_N DECIMAL(14,4)      NOT NULL,
    DISC_MAXAMOUNT_N DECIMAL(14,4)      NOT NULL,
    DISC_PCT         DECIMAL(5,3),
    CONSTRAINT PK_DISCOUNT 
               PRIMARY KEY(DISC_MINAMOUNT_N, DISC_MAXAMOUNT_N)
)
;
   
-- 
-- TABLE: RESELLER 
--
   
CREATE TABLE RESELLER ( 
  RESELLER_ID_N         INT     NOT NULL, 
  RESELLER_NAME_S       VARCHAR(30), 
  RESELLER_SUPPLIER_ID  INT, 
  CONSTRAINT PK_RESELLER
  PRIMARY KEY (RESELLER_ID_N) 
)
;
   
-- 
-- INDEXES
--
   
CREATE INDEX IDX_ADDR_CUST ON ADDRESS(ADDR_CUSTID_FN)
;
   
CREATE INDEX IDX_CUST_PAYTERMS ON CUSTOMER(CUST_PAYTERMSID_FN)
;
   
CREATE INDEX IDX_CUST_SALESMAN ON CUSTOMER(CUST_SALESMANID_FN)
;
   
CREATE INDEX IDX_ORDHDR_CUST ON ORDER_HEADER(ORDHDR_CUSTID_FN)
;
   
CREATE INDEX IDX_ORDHDR_STATUS ON ORDER_HEADER(ORDHDR_STATUSID_FN)
;
   
CREATE INDEX IDX_ORDHDR_PAYTERM ON ORDER_HEADER(ORDHDR_PAYTERMS_FN)
;
   
CREATE INDEX IDX_ORDHDR_SALES ON ORDER_HEADER(ORDHDR_SALESMANID_FN)
;
   
CREATE INDEX IDX_ORDLINE_ORDHDR ON ORDER_LINE(ORDLINE_ORDHDRID_FN)
;
   
CREATE INDEX IDX_ORDLINE_PROD ON ORDER_LINE(ORDLINE_PRODID_FN)
;
   
CREATE INDEX IDX_ORDSHIP_ORD ON ORDER_SHIPMENT(ORDSHIP_ORDHDR_ID_FN)
;
   
CREATE INDEX IDX_ORDSHIP_SHIP ON ORDER_SHIPMENT(ORDSHIP_SHIPMENT_ID_FN)
;
   
CREATE INDEX IDX_PHONE_CUST ON PHONE(PHONE_CUSTID_FN)
;
   
CREATE INDEX IDX_RESELLER_RESSUPID ON RESELLER(RESELLER_SUPPLIER_ID)
;
   
-- 
--  FOREIGN KEYS 
--
   
ALTER TABLE ADDRESS ADD CONSTRAINT FK_ADDR_CUST 
    FOREIGN KEY (ADDR_CUSTID_FN)
    REFERENCES CUSTOMER(CUST_ID_N)
;
   
ALTER TABLE ADDRESS ADD  CONSTRAINT FK_ADDR_SALESMAN
    FOREIGN KEY (ADDR_SALESMANID_FN) 
    REFERENCES SALESMAN (SALESMAN_ID_N) ;
   
ALTER TABLE CUSTOMER ADD CONSTRAINT FK_CUST_PAYTERMS 
    FOREIGN KEY (CUST_PAYTERMSID_FN)
    REFERENCES PAYMENT_TERMS(PAYTERMS_ID_N)
;
   
ALTER TABLE CUSTOMER ADD CONSTRAINT FK_CUST_SALESMAN 
    FOREIGN KEY (CUST_SALESMANID_FN)
    REFERENCES SALESMAN(SALESMAN_ID_N)
;
   
ALTER TABLE ORDER_HEADER ADD CONSTRAINT FK_ORDHDR_PAYTERMS 
    FOREIGN KEY (ORDHDR_PAYTERMS_FN)
    REFERENCES PAYMENT_TERMS(PAYTERMS_ID_N)
;
   
ALTER TABLE ORDER_HEADER ADD CONSTRAINT FK_ORDHDR_CUSTOMER 
    FOREIGN KEY (ORDHDR_CUSTID_FN)
    REFERENCES CUSTOMER(CUST_ID_N)
;
   
ALTER TABLE ORDER_HEADER ADD CONSTRAINT FK_ORDHDR_STAT 
    FOREIGN KEY (ORDHDR_STATUSID_FN)
    REFERENCES STATUS(STATUS_ID_N)
;
   
ALTER TABLE ORDER_HEADER ADD CONSTRAINT FK_ORDHDR_SALES 
    FOREIGN KEY (ORDHDR_SALESMANID_FN)
    REFERENCES SALESMAN(SALESMAN_ID_N)
;
   
ALTER TABLE ORDER_LINE ADD CONSTRAINT FK_ORDLINE_ORDHDR 
    FOREIGN KEY (ORDLINE_ORDHDRID_FN)
    REFERENCES ORDER_HEADER(ORDHDR_ID_N)
;
   
ALTER TABLE ORDER_LINE ADD CONSTRAINT FK_ORDLINE_PRODUCT 
    FOREIGN KEY (ORDLINE_PRODID_FN)
    REFERENCES PRODUCT(PROD_ID_N)
;
   
ALTER TABLE ORDER_SHIPMENT ADD CONSTRAINT FK_ORDSH_ORD 
    FOREIGN KEY (ORDSHIP_ORDHDR_ID_FN)
    REFERENCES ORDER_HEADER(ORDHDR_ID_N)
;
   
ALTER TABLE ORDER_SHIPMENT ADD CONSTRAINT FK_ORDSH_SHIP 
    FOREIGN KEY (ORDSHIP_SHIPMENT_ID_FN)
    REFERENCES SHIPMENT(SHIPMENT_ID_N)
;
   
ALTER TABLE PHONE ADD CONSTRAINT FK_PHONE_CUST 
    FOREIGN KEY (PHONE_CUSTID_FN)
    REFERENCES CUSTOMER(CUST_ID_N)
;
   
ALTER TABLE PHONE ADD CONSTRAINT FK_SALESMAN_CUST
    FOREIGN KEY (PHONE_SALESMANID_FN) 
    REFERENCES SALESMAN (SALESMAN_ID_N)
;
   
ALTER TABLE RESELLER ADD CONSTRAINT FK_RESELLER_SUPPLIER
    FOREIGN KEY (RESELLER_SUPPLIER_ID) 
    REFERENCES RESELLER (RESELLER_ID_N)
;
   
--
-- VIEW V_CUSTOMER_TOTALS
--
   
CREATE VIEW   v_customer_totals
(
              customer_name,
              order_number,
              total_price
)
 AS
(
 SELECT       customer.cust_name_s, 
              order_header.ordhdr_nbr_s, 
              sum(product.prod_price_n * order_line.ordline_ordqty_n) 
 FROM         customer, 
              order_header,
              order_line,
              product 
 WHERE        customer.cust_id_n = order_header.ordhdr_custid_fn
 AND          order_header.ordhdr_id_n = order_line.ordline_ordhdrid_fn
 AND          product.prod_id_n = order_line.ordline_prodid_fn
 AND          order_line.ordline_ordqty_n IS NOT NULL
 GROUP BY     customer.cust_name_s,
              order_header.ordhdr_nbr_s
)
;
--
-- CREATE VIEW V_CUSTOMER_STATUS
--
   
CREATE VIEW   v_customer_status 
( 
              name,
              status 
)
AS
SELECT        cust_name_s, 
              cust_status_s
FROM          customer
;
   
--
--CREATE VIEW V_PHONE_NUMBER
--
   
CREATE VIEW   v_phone_number
( 
              phone_id, 
              phone_number
)
AS 
SELECT        phone_id_n, 
              phone_phonenum_s
FROM          phone
WHERE         phone_type_s = 'PHONE';
   
   
--
--CREATE VIEW V_FAX NUMBER
--
   
CREATE VIEW   v_fax_number
( 
              fax_id, 
              fax_number
)
AS 
SELECT        phone_id_n, 
              phone_phonenum_s
FROM          phone
WHERE         phone_type_s = 'FAX'
WITH CHECK OPTION
;
   
   
--
-- CREATE VIEW V_CUSTOMER_TOTALS_OVER_15000
--
   
CREATE VIEW   v_customer_totals_over_15000
AS
SELECT        * 
FROM          v_customer_totals 
WHERE         total_price > 15000;
   
   
   
--
-- CREATE VIEW V_CONTACT_LIST
--
   
CREATE VIEW   v_contact_list
(
              name,
              phone_number,
              contact_type
)
AS
SELECT        cust_name_s, 
              phone_phonenum_s,
              'customer'
FROM          customer,
              phone
WHERE         cust_id_n = phone_custid_fn 
AND           phone_type_s = 'PHONE'
UNION
SELECT        salesman_name_s,
              phone_phonenum_s,
              'salesperson'
FROM          salesman,
              phone
WHERE         salesman_id_n = phone_salesmanid_fn
AND           phone_type_s = 'PHONE';
   
   
--
--CREATE VIEW V_WILE_BESS_ORDERS
--
   
CREATE VIEW   v_wile_bess_orders
(
              order_number,
              order_date
)
AS
SELECT        ordhdr_nbr_s, 
              ordhdr_orderdate_d 
FROM          order_header 
WHERE         ordhdr_custid_fn IN
          (
           SELECT   cust_id_n
           FROM     customer
           WHERE    cust_name_s = 'WILE BESS COMPANY'
          )
;
   
CREATE VIEW   v_customer_totals_wilebess
AS
SELECT        customer_name, 
              total_price
FROM          v_customer_totals
WHERE         customer_name = 'WILE BESS COMPANY'
;

The same set of scripts with just a slight modification will create the ACME database with Oracle. All you would need to do is to replace the SHIPMENT_CREATEDATE_D column data type from TIMESTAMP to DATE in table SHIPMENT.

To create an MS SQL ACME database, the SHIPMENT_CREATEDATE_D column data type has to be changed to DATETIME (or SMALLDATETIME); in addition, all DATE columns need to be altered to the appropriate MS SQL datatypes.

Note 

The script above is as generic as possible; the actual SQL statements on your CD-ROM are more implementation-specific.