我正在尝试创建一个具有日期约束的表,该表将使信用卡到期日期的日期值为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;
答案 0 :(得分:0)
date
总有一天。月,年,小时,分钟和秒。您可以存储该月初的午夜日期并验证exp_date = trunc(exp_date, 'MM')
。当您向用户显示值时,您可以使用to_char
表达式以您希望的格式显示它。
或者,您可以以MM/YY
格式存储字符串,并且您的检查约束可以对该字符串进行各种验证(即前两个字符是1到12之间的数字,第四个和第五个字符是a数字在15到25之间等。)
答案 1 :(得分:0)
正如其他人所说,Oracle中的DATE值始终包含YEAR,MONTH,DAY,HOURS,MINUTES和SECONDS字段。我想你想要做的是在EXP_DATE列中存储到期日的最后一天/小时/分钟/秒,例如如果卡上显示的到期时间是' 07/19'您希望在EXP_DATE字段中存储31-JUL-2019 23:59:59,这是该卡有效的最后一秒。然后,当您想要以通常的MM / YY格式显示到期日期时,您只需使用TO_CHAR格式化它,例如, TO_CHAR(EXP_DATE, 'MM/YY')
。
祝你好运。