2013-04-22 2 views
-1

у меня есть процедура, как показано ниже, но когда я попытался запустить его с помощью SQLPLUS его дал мне ошибкуошибка неверный номер ORA-01722 в процедуре

НАЧАТЬ IB_ARCHIVE_FDS («FDS_LOG», «TIME_REQUEST», 5, 6); КОНЕЦ;

ОШИБКА в строке 1: ORA-01722: неправильный номер ORA-06512: на "NIAGA.IB_ARCHIVE_FDS", строка 10 ORA-06512: в строке 1

и я использую Oracle 9i

CREATE OR replace PROCEDURE Ib_archive_fds(table_name  VARCHAR2, 
              column_name VARCHAR2, 
              success_period NUMBER, 
              active_period NUMBER) 
IS 
    TYPE fds_tabs 
    IS TABLE OF ib_fds_log%ROWTYPE INDEX BY PLS_INTEGER; 
    TYPE fds_message_id 
    IS TABLE OF ib_fds_log.message_id%TYPE INDEX BY PLS_INTEGER; 
    v_fds_log FDS_TABS; 
    v_message_id FDS_MESSAGE_ID; 
BEGIN 
    SELECT * 
    bulk collect INTO v_fds_log 
    FROM ib_fds_log2 
    WHERE direction = 0 
      AND status_fds_message = 0 
      AND time_request < Trunc(SYSDATE - ' || SUCCESS_PERIOD || ' - 1); 

    FOR i IN 1 .. v_fds_log.last LOOP 
     V_message_id(i) := V_fds_log(i).message_id; 
    END LOOP; 

    forall indx IN 1 .. v_fds_log.count 
     INSERT INTO ib_fds_log3 
     VALUES V_fds_log(indx); 

    COMMIT; 

    forall indx IN 1 .. v_fds_log.count 
     DELETE FROM ib_fds_log2 
     WHERE message_id = V_message_id(indx); 

    COMMIT; 
END; 

Может ли кто-нибудь помочь мне решить мою проблему здесь.

+0

Что означает 'sysdate - '|| SUCCESS_PERIOD || '- 1' делать? –

+1

@ Colin'tHart - он бросает ORA-01722, в основном ... –

+0

Вот что я подумал, но, будучи утром в понедельник, я был не так уверен. –

ответ

4

Хотя я согласен с анализом Дэвида о недостатках вашей реализации фактической причиной этого сообщения об ошибке это ошибка:

time_request < trunc(sysdate - ' || SUCCESS_PERIOD || '- 1); 

SUCCESS_PERIOD является параметром, и Вы, вероятно, хотите использовать его в расчете даты. Однако вы закодировали его как строку; строка не является числом, поэтому мы не можем использовать ее в подстановке.

Я не совсем уверен, что арифметические вы пытаетесь достичь, но я думаю, что вы хотите, либо это ...

time_request < trunc(sysdate - (SUCCESS_PERIOD - 1)); 

... или это ...

time_request < trunc(sysdate - (SUCCESS_PERIOD + 1)); 

... в зависимости от того, как вы хотите изменить значение SUCCESS_PERIOD.

+0

привет @APC, за меня отвечает. – DevYudh

+0

Я попытался изменить свой код, как то, что предлагаю здесь. но это дало мне новую ошибку. ORA-06502: PL/SQL: числовая или ошибка значения – DevYudh

+0

Каков тип данных TIME_REQUEST? Вы не можете ожидать от нас отладки вашего кода, если вы не предоставите всю необходимую информацию. – APC

4

Этот код почти наверняка избежать курсоры полностью и просто использовать операторы SQL - что-то вдоль линий ...

procedure ib_archive_fds(
    table_name  varchar2, 
    column_name varchar2, 
    success_period number , 
    active_period number ) 
is 
    time_request_limit date; 
begin 
    time_request_limit := trunc(sysdate - success_period - 1) 

    insert into 
    ib_fds_log3 
    select 
    * 
    from 
    ib_fds_log2 
    where 
    direction   = 0 and 
    status_fds_message = 0 and 
    time_request  < ib_archive_fds.time_request_limit; 

    delete from 
    ib_fds_log2 
    where 
    direction   = 0 and 
    status_fds_message = 0 and 
    time_request  < ib_archive_fds.time_request_limit; 
end; 

Различные усовершенствования были бы возможны, если результирующий набор запроса не является постоянной когда это выполняется, но все PL/SQL просто запрашивают ошибки и проблемы с производительностью.

+0

Я действительно не понимаю, что такое 'sysdate - '|| success_period || '- 1'. –

+0

Действительно. Похоже на арифметику даты. Исправлена ​​моя версия. –

+0

да, вы правы @david, – DevYudh

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