2013-09-24 47 views
1

表結構在將值插入表時出錯?

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

觸發

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: 

鈣ñ任何人建議我哪裏出現錯誤?

+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

好吧然後如何插入值的值(我的意思是在其中甲) – user2801653

+0

插入沒有變化..這只是一個檢查。你可以按照正常的方式做。 INSERT INTO \t T3(ENTERING_TIME) VALUES \t(TO_TIMESTAMP('01/01/2010上午八時31分51秒」, \t \t \t \t 'DD/MM/RR HH:MI:SSAM.FF')); – SriniV

+0

你插入查詢顯示錯誤,如缺少逗號 – user2801653

1

它看起來像有在你的代碼的一些錯誤,

  • 您正在嘗試一個字符串存入到timestamp變量。

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

  • HH12:MI:SSAM,不HH12:MM:SSAMMI是分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(entering_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