2015-11-17 2 views
0

Я пытаюсь создать таблицу с ограничением по дате, которая сделает значение даты MM/YY для даты истечения срока действия кредитной карты. Когда я пытаюсь создать таблицу ниже я получаю сообщение об ошибке:Создание таблицы с датой проверки кода - Oracle PL SQL

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

'CHECK TO_CHAR (exp_date, 'MM/YY'),' не имеет смысла. Вам нужно сравнить результат вызова 'to_char()' с _something_ (как и с другими ограничениями). Также: ваш параметр '11/19' не является допустимой датой. Подробнее о том, как написать правильный лимит даты, см. В руководстве: https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements003.htm#SQLRF51062 –

ответ

0

A date всегда имеет день. месяц, год, час, минута и секунда. Вы можете сохранить дату, которая составляет полночь в первый месяц, и подтвердить, что exp_date = trunc(exp_date, 'MM'). Когда вы показываете значение для пользователя, вы должны использовать выражение to_char, чтобы отобразить его в том формате, который вы хотите.

В качестве альтернативы вы можете сохранить строку в формате MM/YY, и ваше проверочное ограничение может поместить различные проверки на эту строку (т.е. первые два символа являются числом от 1 до 12, четвертый и пятый символы - числом от 15 и 25 и т. д.).

0

Как уже отмечалось, значение DATE в Oracle всегда имеет поля YEAR, MONTH, DAY, HOURS, MINUTES и SECONDS. Я думаю, что вы хотите сделать это, чтобы сохранить последний день/час/минуту/секунду даты истечения срока действия в столбце EXP_DATE, например. если срок действия, указанный на карте, равен '07/19 ', вы хотите сохранить 31-JUL-2019 23:59:59, что является последней возможной секундой, когда карта действительна, в поле EXP_DATE. Затем, когда вы хотите отобразить дату истечения срока действия в обычном формате MM/YY, вам просто нужно отформатировать ее с помощью TO_CHAR, например. TO_CHAR(EXP_DATE, 'MM/YY').

Удачи.

Смежные вопросы