Округление метки времени (9) в хранимой процедуре Oracle 11g - PullRequest
2 голосов
/ 22 января 2011

Следующая процедура округляет метку времени (9) до метки времени (6):

CREATE
    TABLE MY_TABLE
    (
        MY_TIMESTAMP TIMESTAMP(9) NOT NULL
    )

CREATE OR REPLACE PROCEDURE "DB"."INSERT_ROW"
(myTimestamp IN TIMESTAMP)
AS
v_sys_error NUMBER := 0;
v_err INTEGER;
v_rc INTEGER;
BEGIN

BEGIN
    INSERT
INTO
    DB.INSERT_ROW
    (
        MY_TIMESTAMP
    )
    VALUES
    (
        myTimestamp
    );
EXCEPTION
WHEN OTHERS THEN
v_sys_error := SQLCODE;
v_err := v_sys_error;
v_rc := SQL%ROWCOUNT;
RAISE;
END;

END;

Вызов, приведенный ниже, вставит: 2007-12-12 12: 23: 45.123457000

@call DB.INSERT_ROW(TIMESTAMP '2007-12-12 12:23:45.123456789');

Принимая во внимание, что код ниже будет вставить это: 2007-12-12 12: 23: 45.123456789

INSERT
INTO
    DB.MY_TABLE
    (
        MY_TIMESTAMP
    )
    VALUES
    (
        TIMESTAMP '2007-12-12 12:23:45.123456789'
    );

Как мне предотвратить это?Использование (myTimestamp IN TIMESTAMP (9)) не может быть подтверждено.

Ответы [ 3 ]

1 голос
/ 22 января 2011
CREATE
    TABLE MY_TABLE
    (
        MY_TIMESTAMP TIMESTAMP(9) NOT NULL
    )

CREATE OR REPLACE PROCEDURE "DB"."INSERT_ROW"
(myTimestamp IN MY_TABLE.MY_TIMESTAMP%TYPE)
...

Это должно сработать.Численно ограниченные типы не допускаются в списке параметров.

1 голос
/ 22 января 2011

Один из способов обойти проблемы точности - это преобразовать его (в конкатате с '') или использовать to_char с форматом при вызове PROC.

Принимать входные данные как VARCHAR2?

преобразование может быть выполнено в INSERT в proc для TIMESTAMP (9)

EDITED: Очевидно, я предположил, что ваше поле таблицы является правильным TIMESTAMP (9), но также проверьте это.

0 голосов
/ 15 апреля 2014

Вы также можете использовать timestamp_unconstrained тип:

create or replace procedure insert_row ( myTimestamp timestamp_unconstrained )
is
begin
  insert into my_table ( my_timestamp ) values ( myTimestamp );
end insert_row;
/

Check http://docs.oracle.com/cd/E18283_01/appdev.112/e17126/predefined.htm:

subtype TIMESTAMP_UNCONSTRAINED     is TIMESTAMP(9);
...