where 子句中的 oracle sysdate
oracle sysdate in where clause
我试图在 Oracle 数据库触发器的 where 子句中使用 SYSDATE,但代码抛出 "ORA-01722: invalid number" 异常。
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')
你知道吗,应该怎么修?
这里是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)
);
/
这里是插入数据的例子
INSERT INTO ATT_REQUEST_DATA (FLAG_ID, DATE_FROM, DATE_TO, CREATED_DATE)
VALUES (2, SYSDATE, SYSDATE, SYSDATE);
这是错误输出
ORA-01722: invalid number
ORA-06512: at "PD.ATT_REQUEST_DATA_TRG_ID", line 4
ORA-04088: error during execution of trigger '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;
/
不是使用 SYSDATE 导致您的问题
您的代码有一些奇怪之处。首先是 gem: TO_NUMBER(COUNT(*))
。 count()
returns 一个数字,所以没有必要投它;幸运的是 Oracle 足够聪明,知道这一点,所以这不是 ORA-01722 错误的根源。
不,那是因为这些操作:('ATT-' + TO_CHAR(SYSDATE, 'YY') + '-%'))
。在 Oracle 中 SQL +
是一个算术运算符:SQL 引擎认为您想要 add 'ATT-'
到 TO_CHAR(SYSDATE, 'YY')
,我们不能对字符串进行加法。要解决此问题,请将 +
替换为连接运算符 ||
:
('ATT-' || TO_CHAR(SYSDATE, 'YY') || '-%'))
试试这个:
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 子句将 SQL 的子部分分解为更小的块,以便于调试。你可以安全地将其重新组合成一个 Select 而无需 WITH 子句
我试图在 Oracle 数据库触发器的 where 子句中使用 SYSDATE,但代码抛出 "ORA-01722: invalid number" 异常。
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')
你知道吗,应该怎么修?
这里是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)
);
/
这里是插入数据的例子
INSERT INTO ATT_REQUEST_DATA (FLAG_ID, DATE_FROM, DATE_TO, CREATED_DATE)
VALUES (2, SYSDATE, SYSDATE, SYSDATE);
这是错误输出
ORA-01722: invalid number
ORA-06512: at "PD.ATT_REQUEST_DATA_TRG_ID", line 4
ORA-04088: error during execution of trigger '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;
/
不是使用 SYSDATE 导致您的问题
您的代码有一些奇怪之处。首先是 gem: TO_NUMBER(COUNT(*))
。 count()
returns 一个数字,所以没有必要投它;幸运的是 Oracle 足够聪明,知道这一点,所以这不是 ORA-01722 错误的根源。
不,那是因为这些操作:('ATT-' + TO_CHAR(SYSDATE, 'YY') + '-%'))
。在 Oracle 中 SQL +
是一个算术运算符:SQL 引擎认为您想要 add 'ATT-'
到 TO_CHAR(SYSDATE, 'YY')
,我们不能对字符串进行加法。要解决此问题,请将 +
替换为连接运算符 ||
:
('ATT-' || TO_CHAR(SYSDATE, 'YY') || '-%'))
试试这个:
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 子句将 SQL 的子部分分解为更小的块,以便于调试。你可以安全地将其重新组合成一个 Select 而无需 WITH 子句