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:

任何人都可以建议我在哪里发生错误?

4

2 回答 2

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'),我们将其时间元素作为自午夜以来的秒数。

于 2013-09-24T09:38:17.513 回答
1

您的代码中似乎有一些错误,

  • 您正在尝试将字符串文字存储到时间戳变量中。

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'));
于 2013-09-24T08:42:15.347 回答