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

Sql 程序中的错误无效编号ORA-01722,sql,oracle,plsql,oracle9i,Sql,Oracle,Plsql,Oracle9i,我有一个如下所示的过程,但当我试图使用sqlplus运行它时,它给了我一个错误 开始IBU存档、FDS日志、时间请求、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,

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

开始IBU存档、FDS日志、时间请求、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; 

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

这段代码几乎肯定会完全避免使用游标,而只使用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都只是询问错误和性能问题。

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

time_request < trunc(sysdate - ' || SUCCESS_PERIOD || '- 1);
。。。或者这个

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

。。。取决于您想如何修改SUCCESS|u PERIOD的值。

我真的无法理解sysdate-“| | SUCCESS|u PERIOD”|-1的作用。确实如此。看起来像是日期算术。更正了我的版本。是的,你是对的@david,sysdate-“| | | | | | | |”-1做什么?@Colin'tHart-它抛出了一个ORA-01722,大部分是…这是我的想法,但在周一早上我不太确定。成功期是数字类型HI@APC,而不是回答我。我试图按照你的建议修改我的代码。但它给了我新的错误。。ORA-06502:PL/SQL:数字或值错误时间请求的数据类型是什么?除非您提供了所有必要的信息,否则您不能期望我们调试您的代码。@DevYudh-您没有说新错误出现在哪一行,但我很确定您现在遇到了@DanielHilgarth早些时候指出的错误。v_fds_log.last是对记录的引用,而不是数字。但是,希望您遵循David的建议,完全避免使用游标,因此这是学术性的…@APC success\u期间是数字数据类型。