SQL Bible [Electronic resources]

Alex Kriegel

نسخه متنی -صفحه : 207/ 144
نمايش فراداده

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.