使用CC Exp Date创建表-Oracle PL SQL



我正在尝试创建一个具有日期约束的表,该表将使信用卡到期日期的日期值为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'))对其进行格式化。

祝你好运。

最新更新