2017-07-17 5 views
0

Ich habe versucht, SYSDATE in where-Klausel in meinem Trigger in Oracle-Datenbank, sondern die Code-throw "ORA-01722: ungültige Nummer" Ausnahme.Oracle-Sysdate in Where-Klausel

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') 

Wissen Sie, wie soll ich es reparieren?


hier Definition von Tabelle

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) 
); 
/

hier ein Beispiel für die eingefügten Daten

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

ist, und hier ist der Fehlerausgang

ORA-01722: invalid Nummer
ORA-06512: bei "PD.ATT_REQUEST_DATA_TRG_ID", Zeile 4
ORA-04088: Fehler bei der Ausführung des Triggers 'PD.ATT_REQUEST_DATA_TRG_ID'


Und hier ist ganz Auslöser

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

kombinieren. Bitte fügen Sie Struktur der 'ATT_REQUEST_DATA' Tabelle, einige Beispieldaten und erwartete Ausgabe. Sie müssen 'TO_NUMBER' nicht für' COUNT (*) 'verwenden. 'COUNT' gibt Ihnen bereits eine NUMMER. –

+0

Fügen Sie es bitte Frage hinzu. Fügen Sie keine Kommentare hinzu. Fügen Sie auch einige Beispieldaten hinzu und geben Sie die gewünschte Ausgabe aus. –

+0

Der Code in Ihrem Auslöser stimmt nicht mit dem von Ihnen geposteten Original-SQL überein. – APC

Antwort

0

Es ist nicht die Verwendung von SYSDATE, die Ihr Problem verursacht

Ihr Code hat ein paar Kuriositäten. Erstens gibt es dieses Juwel: TO_NUMBER(COUNT(*)). count() gibt eine Zahl zurück, so dass es nicht notwendig ist, sie zu übertragen; Zum Glück ist Oracle schlau genug, das zu wissen, also ist das nicht die Quelle des ORA-01722-Fehlers.

Nein, das ist wegen dieser Operationen: ('ATT-' + TO_CHAR(SYSDATE, 'YY') + '-%')). In Oracle SQL + ist ein arithmetischer Operator: die SQL-Engine denkt, dass Sie möchten 'ATT-' zu hinzufügen, und wir können nicht hinzufügen, auf Zeichenfolgen. Um dies zu beheben, ersetzen + mit dem Verkettungsoperator ||:

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

versuchen Sie dies:

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

Hinweis zu sehen, die ich verwendet WITH-Klausel ausklammern Unter Teile ur SQL in kleinere Stücke, um das Debuggen zu erleichtern. Sie können dies sicher zu einem einzigen Select ohne die WITH-Klausel