oracle sysdate在where子句中

时间:2017-07-17 08:00:50

标签: sql oracle triggers sysdate

我尝试在oracle数据库的触发器中的where子句中使用SYSDATE,但代码抛出“ORA-01722:无效数字”异常。

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

2 个答案:

答案 0 :(得分: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') || '-%')) 

答案 1 :(得分: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

注意,我使用WITH子句将ur SQL的子部分分解为较小的块以使调试更容易。你可以安全地将它重新组合成一个没有WITH子句的选择