2013-04-22 39 views
-1

我有一個方法像下面,但是當我試圖使用運行它的sqlplus它給了我錯誤錯誤無效號碼ORA-01722的過程

BEGIN IB_ARCHIVE_FDS(「FDS_LOG」,「TIME_REQUEST」, 5,6);結束; ORA-01722::無效號碼ORA-06512:

位於第1行錯誤在 「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'呢? – 2013-04-22 08:18:31

+1

@ Colin'tHart - 它拋出一個ORA-01722,主要是... – 2013-04-22 08:26:50

+0

這就是我的想法,但星期一上午我不太確定。 – 2013-04-22 08:31:37

回答

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,thans回覆我。 – DevYudh 2013-04-22 10:01:46

+0

我試圖改變我的代碼,就像你在這裏建議的。但它給了我新的錯誤.. ORA-06502:PL/SQL:數字或值錯誤 – DevYudh 2013-04-22 10:02:32

+0

什麼是TIME_REQUEST的數據類型?除非您提供所有必要的信息,否則您不能指望我們調試您的代碼。 – APC 2013-04-22 10:05:39

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'。 – 2013-04-22 08:17:11

+0

確實。看起來像日期算術。更正了我的版本。 – 2013-04-22 08:22:30

+0

是的,你是對的@大衛, – DevYudh 2013-04-22 09:59:27