/* Self_Check_2_1 */
CREATE TABLE sc_2_1_orders
(
order_id NUMBER(12, 0),
order_date DATE,
order_mode VARCHAR2(8 BYTE),
customer_id NUMBER(6, 0),
order_status NUMBER(2, 0),
order_total NUMBER(8, 2) DEFAULT 0,
sales_rep_id NUMBER(6, 0),
promotion_id NUMBER(6, 0),
CONSTRAINT PK_ORDER_ID PRIMARY KEY
(order_id),
CONSTRAINT CK_ORDER_MODE CHECK
(order_mode IN ('direct', 'online'))
);
/* Self_Check_2_2 */
CREATE TABLE sc_2_2_order_items
(
order_id NUMBER(12, 0),
line_item_id NUMBER(3, 0),
product_id NUMBER(3, 0),
unit_price NUMBER(8, 2) DEFAULT 0,
quantity NUMBER(8, 0) DEFAULT 0,
CONSTRAINT PK_OI_LID PRIMARY KEY(order_id, line_item_id)
);
/* Self_Check_2_3 */
CREATE TABLE sc_2_3_promotions
(
promo_id NUMBER(6, 0),
promo_name VARCHAR2(20),
CONSTRAINT PK_PROMO_ID PRIMARY KEY(promo_id)
);
/* Self_Check_2_4 */
/*
Q. FLOAT type을 지정할 때, FLOAT(126) 이처럼 precision을 지정할 수 있다.
이 수는, binary digit을 의미한다.
FLOAT(126)의 Decimal digit은, 126 * 0.30103의 연산 결과, 37.92978이 된다.
즉 NUMBER type의 digit이 38인 data와 같은 length의 digit을 가지는 것이다.
왜 0.30103을 곱하는 것인가?
A.
# FLOAT precision의 범위는 1 ~ 128이다.
왜냐하면, 4-byte single precision을 갖기 때문이다.
즉 유효숫자는 7 bits이고, 이 유효숫자 범위 내에서
'p'로 표현가능한 수의 범위는 1 ~ 128 (128개)이다.
MSB는 부호를 의미하는 bit이고, 나머지 23 bits는
fraction을 표현하기 위한 부분이다.
# Bias notation을 사용하여 single precision에 대응하는 bias 127을 사용한다.
최대 표현 가능한 숫자는 2^(exponent - 1)이므로,
이를 scientific notation으로 표현하면, 1.xxx * 10^38이 된다.
그러므로 FLOAT이 NUMBER의 sub data type이라고 말한다.
# 0.30103을 곱하는 이유는 이 single precision의
최대 표현 가능한 decimal digit을 구하기 위해서다.
*/
/* Self_Check_2_5 */
CREATE SEQUENCE sc_2_5_orders_seq
INCREMENT BY 1
START WITH 1000
MINVALUE 1
MAXVALUE 99999999
;