错误过程中的编号ORA-01722无效



我有一个如下的过程,但当我尝试使用sqlplus运行它时,它给了我错误

开始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; 

有人能帮我解决这里的问题吗。

虽然我同意David对您的实现缺点的分析,但错误消息的实际原因是这个错误:

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的值。

这段代码几乎肯定应该完全避免游标,只使用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都只是在询问错误和性能问题,那么各种增强都是可能的。

最新更新