我正在尝试创建一个具有日期约束的表,该表将使信用卡到期日期的日期值为MM/YY。当我尝试创建下表时,我收到错误:
CONSTRAINT exp_check CHECK TO_CHAR(exp_date,'MM/YY'),
*
ERROR at line 19:
ORA-00906: missing left parenthesis
Create table Orders
(o_id int NOT NULL,
c_id int NOT NULL,
p_id int NOT NULL,
s_id int NOT NULL,
order_date date DEFAULT sysdate,
o_qty number NOT NULL,
order_total number NOT NULL,
card_type varchar2(50) NOT NULL,
cc_number varchar2(50) NOT NULL,
exp_date date NOT NULL,
shipping_date date,
shipping_status varchar2(50) DEFAULT 'Not Shipped Yet',
UNIQUE (o_ID, c_ID, p_ID),
CONSTRAINT order_ID PRIMARY KEY (O_ID),
CONSTRAINT fk_cust_id FOREIGN KEY (C_ID) REFERENCES customers(C_ID),
CONSTRAINT fk_ship_id FOREIGN KEY (S_ID) REFERENCES shipping(S_ID),
CONSTRAINT qty_check CHECK (o_qty >= 0),
CONSTRAINT exp_check CHECK TO_CHAR(exp_date,'MM/YY'),
CONSTRAINT s_check CHECK (shipping_status IN
('Not shipped yet', 'Shipped', 'Delivered'))
);
一旦我能够创建表,我将创建一个执行的存储过程,该过程将执行以下内容:
SET SERVEROUTPUT ON;
DECLARE
i_result varchar2(100);
BEGIN
place_order(2200,1,'Regular','VISA','1111-1111-2222-3333',11/19,1040,i_result);
END;
date
总是有一天。月、年、小时、分钟和秒。您可以存储一个月1日午夜的日期,并验证exp_date = trunc(exp_date, 'MM')
。当您向用户显示该值时,您可以使用to_char
表达式以所需的格式显示该值。
或者,您可以将字符串存储为MM/YY
格式,并且您的检查约束可以对该字符串进行各种验证(即,前两个字符是1到12之间的数字,第四个和第五个字符是15到25之间的数字等)
正如其他人所说,Oracle中的DATE值总是包含字段YEAR、MONTH、DAY、HOURS、MINUTES和SECONDS。我认为您在这里要做的是将到期日的最后一天/小时/分钟/秒存储在EXP_date列中,例如,如果卡上显示的到期日为"07/19",则您需要在EXP_date字段中存储2019年7月31日23:59:59,这是卡有效的最后一秒。然后,当您想以通常的MM/YY格式显示到期日期时,您只需要使用to_CHAR(例如TO_CHAR(EXP_DATE, 'MM/YY')
)对其进行格式化。
祝你好运。