2017-07-17 148 views
0

我試圖在oracle數據庫的觸發器的where子句中使用SYSDATE,但代碼引發「ORA-01722:invalid number」異常。oracle sysdate在where子句中

SELECT 'ATT' || '-' || TO_CHAR(SYSDATE, 'YY') || '-' 
     || LPAD((SELECT TO_NUMBER(COUNT(*)) 
       FROM ATT_REQUEST_DATA 
       WHERE REQID like ('ATT-' + TO_CHAR(SYSDATE, 'YY') + '-%')) + 1, '4', '0') 

你知道,我應該怎麼修復呢?


這裏是表的定義

CREATE TABLE ATT_REQUEST_DATA 
(REQID VARCHAR2(50), 
    REQ_SUBID NUMBER, 
    FLAG_ID NUMBER, 
    DATE_FROM DATE, 
    DATE_TO DATE, 
    CREATED_DATE DATE, 

    CONSTRAINT ATT_REQUEST_DATA_PK PRIMARY KEY (REQID, REQ_SUBID) 
); 
/

這裏是插入數據

INSERT INTO ATT_REQUEST_DATA (FLAG_ID, DATE_FROM, DATE_TO, CREATED_DATE) 
VALUES (2, SYSDATE, SYSDATE, SYSDATE); 

和這裏的一個例子是誤差輸出

ORA-01722:無效號碼
ORA-06512:在 「PD.ATT_REQUEST_DATA_TRG_ID」,第4行
ORA-04088:觸發的執行期間錯誤 'PD.ATT_REQUEST_DATA_TRG_ID'


這裏是整個觸發

CREATE OR REPLACE TRIGGER ATT_REQUEST_DATA_TRG_ID 
BEFORE INSERT ON ATT_REQUEST_DATA FOR EACH ROW 
BEGIN 
    IF (:NEW.REQID IS NULL) THEN 

     SELECT 'ATT' || '-' || TO_CHAR(SYSDATE, 'YY') || '-' || LPAD((SELECT TO_NUMBER(COUNT(*)) FROM ATT_REQUEST_DATA WHERE REQID like ('ATT-' + TO_CHAR(SYSDATE, 'YY') + '-%')) + 1, '4', '0') 
     INTO :NEW.REQID 
     FROM DUAL; 

     SELECT (SELECT COUNT(*) FROM ATT_REQUEST_DATA WHERE REQID = :NEW.REQID) + 1 
     INTO :NEW.REQ_SUBID 
     FROM DUAL; 


    END IF; 

END; 
/
+0

請添加'ATT_REQUEST_DATA'表的結構,一些樣本數據和期望的輸出。您不需要爲'COUNT(*)'使用'TO_NUMBER'。 'COUNT'已經給你一個NUMBER。 –

+0

請加上它。不要添加評論。還要添加一些你想要的樣本數據和輸出 –

+0

你觸發器中的代碼與你發佈的原始SQL不匹配 – APC

回答

0

這不是使用SYSDATE導致你的問題

你的代碼有幾個怪事。首先是這個寶石:TO_NUMBER(COUNT(*))count()返回一個數字,因此不需要施放它;幸運的是,Oracle很聰明,知道這一點,所以這不是ORA-01722錯誤的根源。

不,那是因爲這些操作:('ATT-' + TO_CHAR(SYSDATE, 'YY') + '-%'))。在Oracle中SQL +是一個算術運算符:SQL引擎認爲你想要'ATT-'TO_CHAR(SYSDATE, 'YY'),我們不能在字符串上進行加法。爲了解決這個問題,與連接符||更換+

('ATT-' || TO_CHAR(SYSDATE, 'YY') || '-%')) 
0

試試這個:

with 
    p as (select 'ATT' || '-' || TO_CHAR(SYSDATE, 'YY') || '-' pattern from dual) 
    , cnt as ( 
    SELECT pattern, COUNT(*) cnt 
    FROM ATT_REQUEST_DATA cross join p 
    WHERE REQID like pattern || '%') 
    , res as (select pattern || LPAD( cnt + 1, '4', '0') from cnt) 
select * from res; 

看到http://sqlfiddle.com/#!4/c971a6/5

注意,我從句用來分解出烏爾SQL的子部分納入更小的塊使調試更容易。你可以安全地把它重組成一個Select而不需要WITH子句