[英]oracle sysdate in where clause
I tried to use SYSDATE in where clause in my trigger in oracle database but the code throw "ORA-01722: invalid number" exception. 我尝试在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')
Do you know, how should I repair it? 您知道吗,我应该如何修理?
here is definition of table 这是表的定义
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)
);
/
here is an example of inserted data 这是插入数据的示例
INSERT INTO ATT_REQUEST_DATA (FLAG_ID, DATE_FROM, DATE_TO, CREATED_DATE)
VALUES (2, SYSDATE, SYSDATE, SYSDATE);
and here is the error output 这是错误输出
ORA-01722: invalid number ORA-01722:编号无效
ORA-06512: at "PD.ATT_REQUEST_DATA_TRG_ID", line 4 ORA-06512:位于“ PD.ATT_REQUEST_DATA_TRG_ID”的第4行
ORA-04088: error during execution of trigger 'PD.ATT_REQUEST_DATA_TRG_ID' ORA-04088:执行触发器'PD.ATT_REQUEST_DATA_TRG_ID'时出错
And here is whole trigger 这是整个触发器
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;
/
It's not the use of SYSDATE that's causing your problem 导致问题的原因不是使用SYSDATE
Your code has a couple of oddities. 您的代码有一些奇怪之处。 Firstly there's this gem: TO_NUMBER(COUNT(*))
. 首先有一个宝石: TO_NUMBER(COUNT(*))
。 count()
returns a number so there's no need to cast it; count()
返回一个数字,因此无需强制转换; fortunately Oracle is clever enough to know this, so that's not the source of the ORA-01722 error. 幸运的是,Oracle足够聪明,知道这一点,所以这不是ORA-01722错误的根源。
No, that is because of these operations: ('ATT-' + TO_CHAR(SYSDATE, 'YY') + '-%'))
. 不,这是因为这些操作:( ('ATT-' + TO_CHAR(SYSDATE, 'YY') + '-%'))
。 In Oracle SQL +
is an arithmetical operator: the SQL engine thinks you want to add 'ATT-'
to TO_CHAR(SYSDATE, 'YY')
, and we cannot do addition on strings. 在Oracle中,SQL +
是算术运算符:SQL引擎认为您要将'ATT-'
添加到TO_CHAR(SYSDATE, 'YY')
,并且我们不能对字符串进行加法运算。 To fix this, replace +
with the concatenation operator ||
要解决此问题,请用串联运算符||
替换+
。 : :
('ATT-' || TO_CHAR(SYSDATE, 'YY') || '-%'))
try this: 尝试这个:
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;
see http://sqlfiddle.com/#!4/c971a6/5 参见http://sqlfiddle.com/#!4/c971a6/5
Note, i used WITH clause to factor out sub parts of ur SQL into smaller chunks to make debugging easier. 注意,我使用WITH子句将SQL的子部分分解为较小的块,从而使调试更加容易。 u can safely recombine this into a single Select without the WITH clause 您可以安全地将其重新组合为一个单独的Select,而无需WITH子句
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.