2013-09-24 4 views
1

структура таблицыошибка при вводе значений в таблицу?

Name   Null Type   
------------- ---- ------------ 
T_NO    NUMBER  
T_NAME    VARCHAR2(10) 
ENTERING_TIME  TIMESTAMP(6) 
LEAVING_TIME  TIMESTAMP(6) 
TO_DATE   DATE 

Trigger

create or replace trigger t4 
before insert 
on t4 
for each row 
declare 
d_entering_time timestamp(6):=to_char('09:00:00AM','HH12:MM:SSAM'); 
begin 
if (:new.entering_time <= d_entering_time) then 
raise_application_error 
(-20002,'Date of joining cannot be after system date.'); 
end if; 
end; 

и мой запрос вставки

insert INTO t3 (entering_time) values (TO_date('8:31:51AM','HH:MI:SSAM')) 

Я получаю следующее сообщение об ошибке:

SQL Error: ORA-06502: PL/SQL: numeric or value error: character to number conversion error 
ORA-06512: at "SYSTEM.T3", line 2 
ORA-04088: error during execution of trigger 'SYSTEM.T3' 
06502. 00000 - "PL/SQL: numeric or value error%s" 
*Cause:  
*Action: 

Ca n кто-нибудь подсказывает мне, где происходит ошибка?

+0

'to_char()' преобразует дату (или временную метку) в строковый литерал. Вместо этого вы хотите 'to_timestamp()'. Знаете ли вы, что временная метка также включает в себя дату? –

+0

, даже если использование 'to_timestamp()' получает такую ​​же ошибку – user2801653

+1

Вы понимаете, что такое временная метка Oracle? http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements001.htm#autoId14 –

ответ

1

Попробуйте это:

CREATE OR REPLACE TRIGGER T4 
    BEFORE INSERT 
    ON T3 
    FOR EACH ROW 
DECLARE 
    SSSSS_ENTERING_TIME NUMBER := 32400; 
BEGIN 
    IF (TO_NUMBER (TO_CHAR (:NEW.ENTERING_TIME, 
          'SSSSS')) <= SSSSS_ENTERING_TIME) 
    THEN 
     RAISE_APPLICATION_ERROR (
          -20002, 
          'Date of joining cannot be after system date.'); 
    END IF; 
END; 

INSERT INTO 
     T3 (ENTERING_TIME) 
VALUES 
     (TO_TIMESTAMP ('01/01/2010 8:31:51AM', 
        'DD/MM/RR HH:MI:SSAM.FF')); 

Примечание: Я извлекал всего секунд с момента часть и преобразован в число для сравнения. Следовательно, я использовал 32400 секунд, что составляет всего 9 часов.

В Oracle мы можем превращать даты в числа и применять к ним арифметику различными способами.

Следовательно, to_char(some_date, 'SSSSS') дает нам свой элемент времени как количество секунд с полуночи.

+0

ok, тогда как вставлять значения в значения (я имею в виду, в каком формате) – user2801653

+0

Без изменений в вставках .. Это всего лишь проверка , Вы можете сделать обычный путь. INSERT INTO \t T3 (ENTERING_TIME) ЗНАЧЕНИЯ \t (TO_TIMESTAMP ('01/01/2010 8:31:51 AM», \t \t \t \t 'DD/MM/RR HH: MI: SSAM.FF')); – SriniV

+0

ur inserting query, показывающий ошибку, как отсутствующая запятая – user2801653

1

Похоже, есть некоторые ошибки в коде,

  • Вы пытаетесь сохранить строковый литерал в переменную для временной метки.

d_entering_time timestamp(6):=to_char('09:00:00AM','HH12:MM:SSAM');

  • Это HH12:MI:SSAM, не HH12:MM:SSAM, MI для минуты и MM для месяца.

Вы можете попробовать, как это,

CREATE OR REPLACE TRIGGER t4 
    BEFORE INSERT ON t3 FOR EACH ROW 
    DECLARE 
     d_entering_time TIMESTAMP :=to_timestamp('09:00:00AM','HH12:MI:SSAM.FF'); 
    BEGIN 
     IF (:NEW.entering_time <= d_entering_time) THEN 
       raise_application_error (-20002,'Date of joining cannot be after system date.'); 
     END IF; 
    END; 

Вставка запроса

INSERT INTO t3 (entering_time) VALUES (to_timestamp('8:31:51AM','HH:MI:SSAM.FF')); 
+0

Это не сработает, если вы попробуете это: INSERT INTO t3 (enter_time) VALUES (to_timestamp ('01/01/2010 9:31:51 AM ',' DD/MM/RR HH: MI: SSAM.FF ')); – SriniV

+0

@DBA thanq я получил свой ожидаемый результат thanq за помощь и ур ценные советы ... thanq .._^_ – user2801653

+0

@realspirituals ya его работа отлично .. – user2801653

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